關於ios中的點贊控制項效果的實現--UIControl
在開發當中,可能很多時候都需要做個點贊的需求,如果用按鈕實現,按鈕作為一個系統複合控制項,外部是一個 View--》UIControl的容器,
內部包含了UILabel和UIImage,以及一些排版規則。用UIButton就很難去做一些在“贊”和“取消贊”切換時的效果。
可是我們又很需要UIButton似的事件響應機制。
怎麼辦?
對! 就是使用UIControl。
UIControl在這裡有兩個突出的優勢:
1.作為UIButton的父控制項,具有UIButton一樣的事件響應機制
2.作為UIView的簡單子控制項,具有作為[內容] 檢視的潛質
設計思路:實現一個自訂控制項,繼承UIControl,裡麵包含一些視圖,包含什麼視圖由你的需求決定,我的是兩張圖片。 然後在事件響應時,兩張圖片進行切換。切換動畫可以自訂。這樣就實現了一個轉場效果自由度很大的點贊按鈕哦!
參考代碼如下:
#import 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
這是一個簡單的實現,最大的優勢,也是這篇文章的目的,就是在轉場效果上的自訂和自由度!
拋磚引玉,希望大家都能做出複合自己心中所想的點贊按鈕!