基于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 交通频道 作文范文 解决省会交通拥堵的思考 大学法律专业毕业生自我鉴定4篇 好好去爱,去生活 集团2010年财务部工作总结 服务三农 带上心灵去旅行 小学四年级作文350字:圣淘沙游记 充分发挥计生协会优势 促进人口与计划生育工作健康发展 组长入党申请书 展开青春的翅膀作文 此时无声胜有声作文600字 水利局档案管理工作汇报 我又一次被判了“无期” 村级换届选举工作总结范文 成功的汗水作文 一座城市的往返车票...一个人,两座城市,过往的欣与酸! 头灶三景 平凡的人间事 幼儿园大班安全教案 百无聊赖的抑郁之路 关于猫的作文400字 森林服装店 在全镇保持共产党员先进性教育活动分析评议阶段动员大会上的讲话 想象作文:万能小屋(仿写) 偷星九月天(天使的日历) 一月份 永不消逝的电波读后感 如果这样你还是跟小三走吧 两学一做教育演讲稿 高扬尊重学生的旗帜演讲稿 音乐像什么的比喻句 孙权劝学教学设计 童年的故事作文500字 为中国种下一朵花 母亲节的惊喜作文500字 注重发现650字 《疯狂原始人》观后感作文350字 我心目中的妈妈650字 送给那些不懂的珍惜的人 肯德基活动 小学一年级作文650字:快乐真好 远亲不如近邻作文500字 我在成长作文800字 银行网点服务工作 最美的时光作文450字 2013学年宣传部工作计划 为高考生加油的好句子 志愿者培训策划书 玩溜溜球的作文 励志故事《“耐克”运动鞋大王的创业传奇》 《青虫之爱》读后感400字

Copyright © 2016 phpStudy |