最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于UIControl控件實(shí)現(xiàn)ios點(diǎn)贊功能

 更新時(shí)間:2015年09月20日 09:33:32   作者:more2010wei  
在開(kāi)發(fā)當(dāng)中,可能很多時(shí)候都需要做個(gè)點(diǎn)贊的需求,如果用按鈕實(shí)現(xiàn),按鈕作為一個(gè)系統(tǒng)復(fù)合控件,外部是一個(gè) View--》UIControl的容器,本文給大家分享一個(gè)基于UIControl控件實(shí)現(xiàn)ios點(diǎn)贊功能,需要的朋友可以參考下

在開(kāi)發(fā)當(dāng)中,可能很多時(shí)候都需要做個(gè)點(diǎn)贊的需求,如果用按鈕實(shí)現(xiàn),按鈕作為一個(gè)系統(tǒng)復(fù)合控件,外部是一個(gè) View--》UIControl的容器,內(nèi)部包含了UILabel和UIImage,以及一些排版規(guī)則。用UIButton就很難去做一些在“贊”和“取消贊”切換時(shí)的效果。
可是我們又很需要UIButton似的事件響應(yīng)機(jī)制。

怎么辦?

對(duì)! 就是使用UIControl。

UIControl在這里有兩個(gè)突出的優(yōu)勢(shì):

1.作為UIButton的父控件,具有UIButton一樣的事件響應(yīng)機(jī)制

2.作為UIView的簡(jiǎn)單子控件,具有作為容器視圖的潛質(zhì)

設(shè)計(jì)思路:實(shí)現(xiàn)一個(gè)自定義控件,繼承UIControl,里面包含一些視圖,包含什么視圖由你的需求決定,我的是兩張圖片。 然后在事件響應(yīng)時(shí),兩張圖片進(jìn)行切換。切換動(dòng)畫(huà)可以自定義。這樣就實(shí)現(xiàn)了一個(gè)切換效果自由度很大的點(diǎn)贊按鈕哦!

參考代碼如下:

#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

這是一個(gè)簡(jiǎn)單的實(shí)現(xiàn),最大的優(yōu)勢(shì),也是這篇文章的目的,就是在切換效果上的自定義和自由度!
拋磚引玉,希望大家都能做出復(fù)合自己心中所想的點(diǎn)贊按鈕!

希望大家對(duì)本文所述感興趣。

相關(guān)文章

  • iPhoneX 序列適配方案(小結(jié))

    iPhoneX 序列適配方案(小結(jié))

    這篇文章主要介紹了iPhoneX 序列適配方案(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • iOS學(xué)習(xí)教程之UIView中坐標(biāo)轉(zhuǎn)換詳解

    iOS學(xué)習(xí)教程之UIView中坐標(biāo)轉(zhuǎn)換詳解

    這篇文章主要給大家介紹了關(guān)于iOS UIView中坐標(biāo)轉(zhuǎn)換的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)跟著小編一起看看吧。
    2017-05-05
  • 詳解如何使用ReactiveObjC

    詳解如何使用ReactiveObjC

    RAC 指的就是 RactiveCocoa ,是 Github 的一個(gè)開(kāi)源框架,能夠通過(guò)信號(hào)提供大量方便的事件處理方案,讓我們更簡(jiǎn)單粗暴地去處理事件,現(xiàn)在分為 ReactiveObjC(OC) 和 ReactiveSwift(swift)。本文將詳細(xì)介紹如何使用ReactiveObjC。
    2021-06-06
  • IOS開(kāi)發(fā)之字典轉(zhuǎn)字符串的實(shí)例詳解

    IOS開(kāi)發(fā)之字典轉(zhuǎn)字符串的實(shí)例詳解

    這篇文章主要介紹了IOS開(kāi)發(fā)之字典轉(zhuǎn)字符串的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家掌握這樣的方法,需要的朋友可以參考下
    2017-10-10
  • iOS開(kāi)發(fā)項(xiàng)目- 基于WebSocket的聊天通訊(1)

    iOS開(kāi)發(fā)項(xiàng)目- 基于WebSocket的聊天通訊(1)

    這篇文章主要介紹了iOS開(kāi)發(fā)項(xiàng)目- 基于WebSocket的聊天通訊,WebSocket是web通信方式的一種,有需要的可以了解一下。
    2016-11-11
  • iOS系統(tǒng)的底層通知框架庫(kù)示例詳解

    iOS系統(tǒng)的底層通知框架庫(kù)示例詳解

    這篇文章主要給大家介紹了關(guān)于iOS系統(tǒng)的底層通知框架庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • safari cookie設(shè)置中文失敗的解決方法

    safari cookie設(shè)置中文失敗的解決方法

    下面小編就為大家?guī)?lái)一篇safari cookie設(shè)置中文失敗的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • IOS 開(kāi)發(fā)之 UITextField限制字?jǐn)?shù)的方法

    IOS 開(kāi)發(fā)之 UITextField限制字?jǐn)?shù)的方法

    這篇文章主要介紹了IOS 開(kāi)發(fā)之 UITextField限制字?jǐn)?shù)的方法的相關(guān)資料,這里提供實(shí)現(xiàn)限制最大字?jǐn)?shù)的方法,需要的朋友可以參考下
    2017-08-08
  • iOS13即將到來(lái),iOS推送DeviceToken適配方案詳解

    iOS13即將到來(lái),iOS推送DeviceToken適配方案詳解

    這篇文章主要介紹了iOS13即將到來(lái),iOS推送DeviceToken適配方案詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 詳解iOS WebDriverAgent 環(huán)境搭建

    詳解iOS WebDriverAgent 環(huán)境搭建

    這篇文章主要介紹了詳解iOS WebDriverAgent 環(huán)境搭建,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論

河北省| 通河县| 油尖旺区| 武威市| 乌拉特后旗| 五莲县| 蚌埠市| 麟游县| 隆回县| 奇台县| 宁明县| 白银市| 土默特左旗| 自贡市| 佛冈县| 金川县| 和平县| 福清市| 灵山县| 河南省| 泸水县| 塘沽区| 台南县| 台江县| 茌平县| 东丽区| 古丈县| 武川县| 洛隆县| 库车县| 姜堰市| 吐鲁番市| 扎赉特旗| 美姑县| 沁水县| 双流县| 竹北市| 石家庄市| 平原县| 独山县| 托克逊县|