
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)思路
- 要給 button 添加兩個屬性.
isShowWave: 是否顯示水波紋
waveView: 水波紋視圖 - 實現(xiàn)這個兩個屬性的 setter,getter 方法.配合 runtime 動態(tài)添加屬性
-
+ (void)load方法中實現(xiàn)方法交換 -
- (instancetype)initWithFrame:(CGRect)frame為了保證水波視圖只創(chuàng)建一次,就從系統(tǒng)的這個方法中創(chuàng)建 -
- (void)setFrame:(CGRect)frame這個方法中可以拿到 UIButton 的大小,從這個方法中設(shè)置波紋視圖的大小比較合適 -
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event這個方法中可以拿到手勢,從這個方法中可以設(shè)置水波視圖的開始顯示的位置,并做動畫.比較合適. - 所以要寫三個自己的方法用 runtime 替換到系統(tǒng)的方法
難點
- 找到合適的系統(tǒng)的方法
-
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)給屬性添加方法
objc_getAssociatedObject(id object, const void *key)獲取類的屬性方法 -
method_exchangeImplementations(Method m1, Method m2)交換方法的實現(xiàn) -
class_addMethod(__unsafe_unretained Class cls, SEL name, IMP imp, const char *types)給類添加方法