基于UIControl控件实现ios点赞功能


在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View--》UIControl的容器,内部包含了UILabel和UIImage,以及一些排版规则。用UIButton就很难去做一些在“赞”和“取消赞”切换时的效果。
可是我们又很需要UIButton似的事件响应机制。

怎么办?

对! 就是使用UIControl。

UIControl在这里有两个突出的优势:

1.作为UIButton的父控件,具有UIButton一样的事件响应机制

2.作为UIView的简单子控件,具有作为容器视图的潜质

设计思路:实现一个自定义控件,继承UIControl,里面包含一些视图,包含什么视图由你的需求决定,我的是两张图片。 然后在事件响应时,两张图片进行切换。切换动画可以自定义。这样就实现了一个切换效果自由度很大的点赞按钮哦!

参考代码如下:

#import <UIKit/UIKit.h> 
typedef NS_ENUM(NSInteger, UIControlFlagMode) { 
  FlagModelNO, 
  FlagModelYES, 
  FlagModelDefalt 
}; 
@interface UIControlFlagView : UIControl 
@property (nonatomic, strong) UIImage*noStateImg; 
@property (nonatomic, strong) UIImage*yesStateImg; 
@property (nonatomic, strong) UIImage*defaultStateImg; 
@property (nonatomic, assign) UIControlFlagMode flag; 
- (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation; 
@end 

m文件:

#import "UIControlFlagView.h" 
@interface UIControlFlagView() 
@property (nonatomic, strong) UIImageView*noStateImgV; 
@property (nonatomic, strong) UIImageView*yesStateImgV; 
@property (nonatomic, strong) UIImageView*defaultStateImgV; 
@end 
@implementation UIControlFlagView 
- (id)initWithFrame:(CGRect)frame 
{ 
  self = [super initWithFrame:frame]; 
  if (self) { 
    // Initialization code 
  } 
  return self; 
} 
- (void)setNoStateImg:(UIImage *)noStateImg 
{ 
  if (!self.noStateImgV) 
  { 
    self.noStateImgV = [[UIImageView alloc] initWithFrame:self.bounds]; 
    self.noStateImgV.contentMode = UIViewContentModeCenter; 
    [self addSubview:self.noStateImgV]; 
    self.flag = FlagModelNO;//default style 
  } 
  self.noStateImgV.image = noStateImg; 
  _noStateImg = noStateImg; 
} 
- (void)setYesStateImg:(UIImage *)yesStateImg 
{ 
  if (!self.yesStateImgV) 
  { 
    self.yesStateImgV = [[UIImageView alloc] initWithFrame:self.bounds]; 
    self.yesStateImgV.contentMode = UIViewContentModeCenter; 
    [self addSubview:self.yesStateImgV]; 
    self.yesStateImgV.alpha = 0.0; 
  } 
   self.yesStateImgV.image = yesStateImg; 
  _yesStateImg = yesStateImg; 
} 
- (void)setDefaultStateImg:(UIImage *)defaultStateImg 
{ 
  if (!self.defaultStateImgV) 
  { 
    self.defaultStateImgV = [[UIImageView alloc] initWithFrame:self.bounds]; 
    self.defaultStateImgV.contentMode = UIViewContentModeCenter; 
    [self addSubview:self.defaultStateImgV]; 
  } 
  self.defaultStateImgV.image = defaultStateImg; 
  _defaultStateImg = defaultStateImg; 
} 
- (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation 
{ 
  if (animation) 
  { 
    //no-->yes 
    if (_flag == FlagModelNO && flag == FlagModelYES) 
    { 
     self.yesStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f); 
     [UIView animateWithDuration:0.3 animations:^{ 
       self.noStateImgV.alpha = 0.0; 
       self.yesStateImgV.alpha = 1.0; 
       self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
       self.noStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f); 
     } 
    completion:^(BOOL finished) 
    { 
       self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
       self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
     }]; 
    } 
    //yes-->no 
    else if(_flag == FlagModelYES && flag == FlagModelNO) 
    { 
      self.noStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f); 
      [UIView animateWithDuration:0.3 animations:^{ 
        self.noStateImgV.alpha = 1.0; 
        self.yesStateImgV.alpha = 0.0; 
        self.yesStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f); 
        self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
      } 
       completion:^(BOOL finished) 
       { 
         self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
         self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
       }]; 
    } 
  } 
  else 
  { 
    //no-->yes 
    if (_flag == FlagModelNO && flag == FlagModelYES) 
    { 
        self.noStateImgV.alpha = 0.0; 
        self.yesStateImgV.alpha = 1.0; 
        self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
        self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
    } 
    //yes-->no 
    else if(_flag == FlagModelYES && flag == FlagModelNO) 
    { 
      self.noStateImgV.alpha = 1.0; 
      self.yesStateImgV.alpha = 0.0; 
      self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
      self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f); 
    } 
  } 
   _flag = flag; 
} 
@end

这是一个简单的实现,最大的优势,也是这篇文章的目的,就是在切换效果上的自定义和自由度!
抛砖引玉,希望大家都能做出复合自己心中所想的点赞按钮!

希望大家对本文所述感兴趣。



相关阅读:
浅析Javascript ES6中的原生Promise
C语言中获取和改变目录的相关函数总结
GridView控件实现数据的修改(第9节)
C#中的文件路径获取函数和文件名字获取函数小结
ORACLE EXP不能导出空表的原因分析及解决方法
C#开源的AOP框架--KingAOP基础
Win10系统分辨率不正确如何调整
java中使用双向链表实现贪吃蛇程序源码分享
解析Android横竖屏切换的问题
win7系统使用打印机设备提示缺少VSPRINT7.OCX的解决方法
PHP实现的通过参数生成MYSQL语句类完整实例
JQuery设置文本框和密码框得到焦点时的样式
C语言+win32api写窗体应用程序
javascript获取select标签选中的值
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 国庆节祝福语集锦 今年我上初三了作文 不忘爱护小树300字 西游记读后感3000字3篇 清明节的习俗作文800字 高中毕业感言30字 一帘幽梦(第二十三节) 学生入党自荐书 人事科年度工作计划 街道残联关于做好残疾人信访工作的几点启示 爱上文字的孩子都忧伤吗? 小学五年级作文450字:家中趣事 我家的三个“蛋” 描写头部的好句|描写头部的好句作文素材 还一个原原本本的我 我是爱你的,莎(litchi s love) 励志电影《E.T》 周密《玉京秋》宋词鉴赏 这辈子欠你的情,让我下辈子来报答 美丽的农场作文500字 我家的保姆 赚钱不容易作文600字 小学四年级作文350字:成都的变化 创先争优学习笔记 鸡的作文500字 绕口令选集 迷惘 作文200字 我身边的环保达人作文 心灵的祈祷 高中高一作文900字:七十年大庆 身教重于言教作文800字 述职报告格式(附范文) 秋情,秋景,秋韵 一场怪风【二】作文400字 保险公司工作总结:失业保险 端午的遐想 恐怖的“作业” 我心目中的香港 我的小伙伴??韩朔作文300字 谈工商依法行政(由潼关事件所想到的) 小学三年级作文450字:星星的祝福 高校调研报告-外联篇 丽江之旅作文 初一作文怎么写 2016scott young ted演讲 教你超速学习 2015《猴王出世》缩写 2016文员个人工作总结 分离后我才懂了你 公共资源市场交易情况自查自纠报告 2015部门工作总结范文简短 教育实践总结

Copyright © 2016 phpStudy |