守望远方

热爱生活 热爱工作 守望远方
UIControl的使用

在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View--》UIControl的容器,

内部包含了UILabel和UIImage,以及一些排版规则。用UIButton就很难去做一些在“赞”和“取消赞”切换时的效果。

可是我们又很需要UIButton似的事件响应机制。

怎么办?

对! 就是使用UIControl。

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

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

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

 

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

参考代码如下:

 

  1. #import <UIKit/UIKit.h>  
  2.   
  3. typedef NS_ENUM(NSInteger, UIControlFlagMode) {  
  4.     FlagModelNO,  
  5.     FlagModelYES,  
  6.     FlagModelDefalt  
  7. };  
  8.   
  9. @interface UIControlFlagView : UIControl  
  10.   
  11.   
  12. @property (nonatomic, strong) UIImage*noStateImg;  
  13. @property (nonatomic, strong) UIImage*yesStateImg;  
  14. @property (nonatomic, strong) UIImage*defaultStateImg;  
  15.   
  16. @property (nonatomic, assign) UIControlFlagMode flag;  
  17.   
  18. - (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation;  
  19.   
  20. @end  


m文件:

 

 

  1. #import "UIControlFlagView.h"  
  2.   
  3. @interface UIControlFlagView()  
  4.   
  5. @property (nonatomic, strong) UIImageView*noStateImgV;  
  6. @property (nonatomic, strong) UIImageView*yesStateImgV;  
  7. @property (nonatomic, strong) UIImageView*defaultStateImgV;  
  8.   
  9. @end  
  10.   
  11. @implementation UIControlFlagView  
  12.   
  13. - (id)initWithFrame:(CGRect)frame  
  14. {  
  15.     self = [super initWithFrame:frame];  
  16.     if (self) {  
  17.         // Initialization code  
  18.     }  
  19.     return self;  
  20. }  
  21.   
  22.   
  23. - (void)setNoStateImg:(UIImage *)noStateImg  
  24. {  
  25.     if (!self.noStateImgV)  
  26.     {  
  27.         self.noStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];  
  28.         self.noStateImgV.contentMode = UIViewContentModeCenter;  
  29.         [self addSubview:self.noStateImgV];  
  30.         self.flag = FlagModelNO;//default style  
  31.     }  
  32.     self.noStateImgV.image = noStateImg;  
  33.     _noStateImg = noStateImg;  
  34. }  
  35.   
  36. - (void)setYesStateImg:(UIImage *)yesStateImg  
  37. {  
  38.     if (!self.yesStateImgV)  
  39.     {  
  40.         self.yesStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];  
  41.         self.yesStateImgV.contentMode = UIViewContentModeCenter;  
  42.         [self addSubview:self.yesStateImgV];  
  43.         self.yesStateImgV.alpha = 0.0;  
  44.     }  
  45.      self.yesStateImgV.image = yesStateImg;  
  46.     _yesStateImg = yesStateImg;  
  47. }  
  48.   
  49. - (void)setDefaultStateImg:(UIImage *)defaultStateImg  
  50. {  
  51.     if (!self.defaultStateImgV)  
  52.     {  
  53.         self.defaultStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];  
  54.         self.defaultStateImgV.contentMode = UIViewContentModeCenter;  
  55.         [self addSubview:self.defaultStateImgV];  
  56.     }  
  57.     self.defaultStateImgV.image = defaultStateImg;  
  58.     _defaultStateImg = defaultStateImg;  
  59. }  
  60.   
  61. - (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation  
  62. {  
  63.      
  64.       
  65.     if (animation)  
  66.     {  
  67.        //no-->yes  
  68.         if (_flag == FlagModelNO && flag == FlagModelYES)  
  69.         {  
  70.           self.yesStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f);  
  71.               
  72.           [UIView animateWithDuration:0.3 animations:^{  
  73.                
  74.               self.noStateImgV.alpha = 0.0;  
  75.               self.yesStateImgV.alpha = 1.0;  
  76.               self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  77.               self.noStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f);  
  78.                 
  79.           }  
  80.         completion:^(BOOL finished)  
  81.         {  
  82.               self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  83.               self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  84.           }];  
  85.               
  86.         }  
  87.         //yes-->no  
  88.         else if(_flag == FlagModelYES && flag == FlagModelNO)  
  89.         {  
  90.             self.noStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f);  
  91.               
  92.             [UIView animateWithDuration:0.3 animations:^{  
  93.                   
  94.                 self.noStateImgV.alpha = 1.0;  
  95.                 self.yesStateImgV.alpha = 0.0;  
  96.                 self.yesStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f);  
  97.                 self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  98.                   
  99.             }  
  100.               completion:^(BOOL finished)  
  101.              {  
  102.                  self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  103.                  self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  104.              }];  
  105.         }  
  106.           
  107.     }  
  108.     else  
  109.     {  
  110.         //no-->yes  
  111.         if (_flag == FlagModelNO && flag == FlagModelYES)  
  112.         {  
  113.                 self.noStateImgV.alpha = 0.0;  
  114.                 self.yesStateImgV.alpha = 1.0;  
  115.                 self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  116.                 self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  117.         }  
  118.         //yes-->no  
  119.         else if(_flag == FlagModelYES && flag == FlagModelNO)  
  120.         {  
  121.             self.noStateImgV.alpha = 1.0;  
  122.             self.yesStateImgV.alpha = 0.0;  
  123.             self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  124.             self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);  
  125.         }  
  126.     }  
  127.       
  128.      _flag = flag;  
  129. }  
  130.   
  131.   
  132. @end  

 

 

这是一个简单的实现,最大的优势,也是这篇文章的目的,就是在切换效果上的自定义和自由度!

抛砖引玉,希望大家都能做出复合自己心中所想的点赞按钮!

posted on 2015-09-06 10:58  守望远方  阅读(579)  评论(0编辑  收藏  举报