虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > IOS编程/Objective-C > 基于UIControl控件实现ios点赞功能

基于UIControl控件实现ios点赞功能
类别:IOS编程/Objective-C   作者:码皇   来源:互联网   点击:

在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View--》UIControl的容器,本文给大家分享一个基于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

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

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

相关热词搜索: ios点赞功能实现 ios点赞实现 ios点赞功能