基于UIControl控件实现ios点赞功能
在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个View--》UIControl的容器,内部包含了UILabel和UIImage,以及一些排版规则。用UIButton就很难去做一些在“赞”和“取消赞”切换时的效果。
可是我们又很需要UIButton似的事件响应机制。
怎么办?
对!就是使用UIControl。
UIControl在这里有两个突出的优势:
1.作为UIButton的父控件,具有UIButton一样的事件响应机制
2.作为UIView的简单子控件,具有作为容器视图的潜质
设计思路:实现一个自定义控件,继承UIControl,里面包含一些视图,包含什么视图由你的需求决定,我的是两张图片。然后在事件响应时,两张图片进行切换。切换动画可以自定义。这样就实现了一个切换效果自由度很大的点赞按钮哦!
参考代码如下:
#import<UIKit/UIKit.h>
typedefNS_ENUM(NSInteger,UIControlFlagMode){
FlagModelNO,
FlagModelYES,
FlagModelDefalt
};
@interfaceUIControlFlagView:UIControl
@property(nonatomic,strong)UIImage*noStateImg;
@property(nonatomic,strong)UIImage*yesStateImg;
@property(nonatomic,strong)UIImage*defaultStateImg;
@property(nonatomic,assign)UIControlFlagModeflag;
-(void)setFlag:(UIControlFlagMode)flagwithAnimation:(BOOL)animation;
@end
m文件:
#import"UIControlFlagView.h"
@interfaceUIControlFlagView()
@property(nonatomic,strong)UIImageView*noStateImgV;
@property(nonatomic,strong)UIImageView*yesStateImgV;
@property(nonatomic,strong)UIImageView*defaultStateImgV;
@end
@implementationUIControlFlagView
-(id)initWithFrame:(CGRect)frame
{
self=[superinitWithFrame:frame];
if(self){
//Initializationcode
}
returnself;
}
-(void)setNoStateImg:(UIImage*)noStateImg
{
if(!self.noStateImgV)
{
self.noStateImgV=[[UIImageViewalloc]initWithFrame:self.bounds];
self.noStateImgV.contentMode=UIViewContentModeCenter;
[selfaddSubview:self.noStateImgV];
self.flag=FlagModelNO;//defaultstyle
}
self.noStateImgV.image=noStateImg;
_noStateImg=noStateImg;
}
-(void)setYesStateImg:(UIImage*)yesStateImg
{
if(!self.yesStateImgV)
{
self.yesStateImgV=[[UIImageViewalloc]initWithFrame:self.bounds];
self.yesStateImgV.contentMode=UIViewContentModeCenter;
[selfaddSubview:self.yesStateImgV];
self.yesStateImgV.alpha=0.0;
}
self.yesStateImgV.image=yesStateImg;
_yesStateImg=yesStateImg;
}
-(void)setDefaultStateImg:(UIImage*)defaultStateImg
{
if(!self.defaultStateImgV)
{
self.defaultStateImgV=[[UIImageViewalloc]initWithFrame:self.bounds];
self.defaultStateImgV.contentMode=UIViewContentModeCenter;
[selfaddSubview:self.defaultStateImgV];
}
self.defaultStateImgV.image=defaultStateImg;
_defaultStateImg=defaultStateImg;
}
-(void)setFlag:(UIControlFlagMode)flagwithAnimation:(BOOL)animation
{
if(animation)
{
//no-->yes
if(_flag==FlagModelNO&&flag==FlagModelYES)
{
self.yesStateImgV.transform=CGAffineTransformMakeScale(0.1f,0.1f);
[UIViewanimateWithDuration:0.3animations:^{
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:^(BOOLfinished)
{
self.yesStateImgV.transform=CGAffineTransformMakeScale(1.0f,1.0f);
self.noStateImgV.transform=CGAffineTransformMakeScale(1.0f,1.0f);
}];
}
//yes-->no
elseif(_flag==FlagModelYES&&flag==FlagModelNO)
{
self.noStateImgV.transform=CGAffineTransformMakeScale(0.1f,0.1f);
[UIViewanimateWithDuration:0.3animations:^{
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:^(BOOLfinished)
{
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
elseif(_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
这是一个简单的实现,最大的优势,也是这篇文章的目的,就是在切换效果上的自定义和自由度!
抛砖引玉,希望大家都能做出复合自己心中所想的点赞按钮!
希望大家对本文所述感兴趣。