iOS 中 UIButton 添加水波紋效果

waveBtn

歡迎 star
歡迎到我的博客查看更多我的文章
看到很多安卓 APP 的 按鈕帶有這種點擊效果忍不住寫了一個看看
iOS的應(yīng)該更好看

使用

    UIButton *button = [[UIButton alloc] init];
    button.frame = CGRectMake(100, 100, 250, 60);
    [self.view addSubview:button];
    [button setTitle:@"點我" forState:0];
    [button setTitleColor:[UIColor blueColor] forState:0];
    [button setBackgroundColor:[UIColor lightGrayColor]];
    
    //水波紋效果
    button.isShowWave = YES;

想實現(xiàn)的效果

  • 給 UIButton 增加一個水波紋的圖層來展示這個波紋
  • 給 UIButton 增加一個屬性用來是否顯示水波紋效果

想到的方案

  • 方案一: 自定義 UIButton
  • 方案二: 給 UIButton 添加一個分類,利用Runtime給 UIButton 添加屬性,交換方法達(dá)到想要的效果

方案對比

  • 方案一的優(yōu)點: 實現(xiàn)起來比較順滑,容易理解.
  • 方案一的缺點: 別人想使用波紋效果,必須使用這個自定義的 UIButton.如果項目中已經(jīng)使用了系統(tǒng)的 UIButton 想使用這種效果.還得修改以前代碼.
  • 方案二的優(yōu)點: 使用簡單,不用修改之前的代碼.
  • 方案二的缺點: 開始不容易想到,想到了就好了啊.

實現(xiàn)思路

  1. 要給 button 添加兩個屬性.
    isShowWave: 是否顯示水波紋
    waveView: 水波紋視圖
  2. 實現(xiàn)這個兩個屬性的 setter,getter 方法.配合 runtime 動態(tài)添加屬性
  3. + (void)load 方法中實現(xiàn)方法交換
  4. - (instancetype)initWithFrame:(CGRect)frame為了保證水波視圖只創(chuàng)建一次,就從系統(tǒng)的這個方法中創(chuàng)建
  5. - (void)setFrame:(CGRect)frame這個方法中可以拿到 UIButton 的大小,從這個方法中設(shè)置波紋視圖的大小比較合適
  6. - (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event 這個方法中可以拿到手勢,從這個方法中可以設(shè)置水波視圖的開始顯示的位置,并做動畫.比較合適.
  7. 所以要寫三個自己的方法用 runtime 替換到系統(tǒng)的方法

難點

  1. 找到合適的系統(tǒng)的方法
  2. objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)給屬性添加方法
    objc_getAssociatedObject(id object, const void *key)獲取類的屬性方法
  3. method_exchangeImplementations(Method m1, Method m2)交換方法的實現(xiàn)
  4. class_addMethod(__unsafe_unretained Class cls, SEL name, IMP imp, const char *types)給類添加方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容