zoukankan      html  css  js  c++  java
  • 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  

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

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

  • 相关阅读:
    del
    sublime右键菜单,anaconda设置
    全概率公式、贝叶斯公式推导过程
    python数据结构之链表(一)
    关于panda中dataframe的与&运算*(stackoverflow高票答案)
    转载:python 日期,季度,年份
    商业模式画布
    互联网思维
    互联网思维
    战略品牌管理_1
  • 原文地址:https://www.cnblogs.com/worldtraveler/p/4784876.html
Copyright © 2011-2022 走看看