1. 程式人生 > >用Runtime解決UIButton重複點選問題

用Runtime解決UIButton重複點選問題

       通常我們在專案中會遇到這樣的問題,點選一個button觸發一個事件,但總是會遇到連點的問題,如果是動畫,連點會讓你的動畫出現意想不到的情況。我在之前的專案中也遇到過類似的情況,上網搜過很多解決方法,但都沒有得到想要解決方案。前幾天在cocoachina一篇文章中得到啟發,自己寫了一Demo共享給大家。廢話不多說先上圖,沒圖說個jiba .


兩個button的點選事件完全相同,都是讓紅色的view的中心點從(25,89)到(200,500)但很明顯沒做控制的button在多次點選的情況下動畫不是我們想要的效果。

再上程式碼

@interface UIControl (YN)

@property (nonatomic, assign) NSTimeInterval hyn_acceptEventInterval;//新增點選事件的間隔事件

@property (nonatomic, assign) BOOL hyn_ignoreEvent;//

@end

#[email protected] UIControl (YN)

static const char *UIControl_acceptEventInterval = "UIControl_acceptEventInterval";

static const char *UIcontrol_ignoreEvent = "UIcontrol_ignoreEvent";

- (NSTimeInterval)hyn_acceptEventInterval {

return [objc_getAssociatedObject(self, UIControl_acceptEventInterval) doubleValue];

}

- (void)setHyn_acceptEventInterval:(NSTimeInterval)hyn_acceptEventInterval {

objc_setAssociatedObject(self, UIControl_acceptEventInterval, @(hyn_acceptEventInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (BOOL)hyn_ignoreEvent {

return [objc_getAssociatedObject(self, UIcontrol_ignoreEvent) boolValue];

}

- (void)setHyn_ignoreEvent:(BOOL)hyn_ignoreEvent {

objc_setAssociatedObject(self, UIcontrol_ignoreEvent, @(hyn_ignoreEvent), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

+ (void)load {

Method a = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));

Method b = class_getInstanceMethod(self, @selector(__hyn_sendAction:to:forEvent:));

method_exchangeImplementations(a, b);

}

- (void)__hyn_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {

if (self.hyn_ignoreEvent) return;

if (self.hyn_acceptEventInterval > 0) {

self.hyn_ignoreEvent = YES;

[self performSelector:@selector(setHyn_ignoreEvent:) withObject:@(NO) afterDelay:self.hyn_acceptEventInterval];

}

[self __hyn_sendAction:action to:target forEvent:event];

}

@end

使用:

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIButton *button;//用Runtime做控制的button

@property (weak, nonatomic) IBOutlet UIView *colorView;//紅色的view

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//設定一個延遲時間,為了方便觀察我這裡把動畫設定成三秒

self.button.hyn_acceptEventInterval = 3;

}

//Runtime控制的button點選事件

- (IBAction)runtimeAction:(UIButton *)sender {

[UIView animateWithDuration:3 animations:^{

self.colorView.center = CGPointMake(200, 500);

} completion:^(BOOL finished) {

self.colorView.center = CGPointMake(25, 89);

}];

}

//普通的buttonAction

- (IBAction)buttonAction:(UIButton *)sender {

[UIView animateWithDuration:3 animations:^{

self.colorView.center = CGPointMake(200, 500);

} completion:^(BOOL finished) {

self.colorView.center = CGPointMake(25, 89);

}];

}

@end

為了方便看程式碼截個圖,這年頭沒圖就是沒把發說事


你還在一個一個單獨控制多次點選嗎?採用Runtime的方法,讓你簡單到1行程式碼解決重複點選問題

self.button.hyn_acceptEventInterval = 0.xx;

就是那麼簡單。

文章靈感來自Cocoachina 

相關推薦

Runtime解決UIButton重複問題

       通常我們在專案中會遇到這樣的問題,點選一個button觸發一個事件,但總是會遇到連點的問題,如果是動畫,連點會讓你的動畫出現意想不到的情況。我在之前的專案中也遇到過類似的情況,上網搜過很多解決方法,但都沒有得到想要解決方案。前幾天在cocoachina一篇文章中得到啟發,自己寫了一Demo共

runtime 解決UIButton 重複問題

可以給按鈕新增一個屬性重複點選間隔, 通過設定這個屬性來控制再次接受點選事件的時間間隔。 @interface UIControl (EventInterval) // 可以用這個給重複點選加間隔 @property (nonatomic, assign

防止UIbutton重複(ios)

文章來自:原始碼線上https://www.shengli.me/css/196.html 使用uibutton的enabled或userIteractionEnabled 使用UIButton的enabled屬性, 在點選後, 禁止UIButton的互動, 直到完成指定任務之後再將其ena

iOS---防止UIButton重複的三種實現方式

通常, 我們會採用如下的一些措施來防止重複點選UIButton: 使用UIButton的enabled或userInteractionEnabled 使用UIButton的enabled屬性, 在點選後, 禁止UIButton的互動, 直到完成指定任務之

防止UIButton重複

使用runtime來對sendAction:to:forEvent:方法進行hook UIControl的sendAction:to:forEvent:方法用於處理事件響應. 如果我們在該方法的實現中, 新增針對點選事件的時間間隔相關的處理程式碼, 則能夠做到在指定時間間隔中防止重複點選. 首先, 為UIBu

解決syszuxpinyin重複lineEdit無法彈出輸入法介面和無法刪除原有內容問題

解決方法均來源於論壇,自己把它給整理一下 1,因為自己做的介面用到了lineedit,但是發現第一次點選lineedit獲得焦點就可以彈出輸入法介面,但是再重複點選的時候就不能彈出來了,必須重新獲得焦點,於是通過過載過載了QLineEdit的mousePressEvent在m

利用Runtime來攔截UIButton事件,防止重複

對於公司原來的一些程式碼,想對UIButton的點選事件做一部分修改,但是如果使用繼承出來的UIBtton來解決的話, 又要改大量的程式碼,這時候,使用runtime攔截替換髮送點選事件的方法可以迅速解決這個問題,超級給力! 不廢話,直接上程式碼 #im

listView資料過多,或過於頻繁崩潰問題解決(防止按鈕重複

在使用者使用 Android 應用的時候,經常會出現過快且多次點選同一按鈕的情況,一方面這是因為應用或手機當前有些卡頓,另一方面也可能是由於很多應用並沒有設定按鈕點選時的 selector 或者其它按鈕響應方式(例如點選按鈕時按鈕放大,常見於遊戲),導致使用者誤認為沒有點選到當前按鈕,當然,除了相

Runtime實現防止按鈕重複

最近測試總說由於手速太快,點選按鈕,連續push了兩次頁面。為了防止按鈕短時間內的重複點選,就用runtime實現防止按鈕的重複點選。 標頭檔案 #import <UIKit/UIKit.h> #define defaultInte

iOS開發 防止UIButton,cell等重複

主要是快速點選button或者cell,所對應的action或者邏輯會走多次,例如:點選button或者cell呼叫撥打電話的方法,會彈出撥打電話框好多次;這個對使用者不太友好;問了下哥們兒,他給了個巨集,目前算是解決這個問題;程式碼如下: // 防止多次

angularJs a標籤重複無效解決方法

在A標籤上加入 ui-sref-opts="{reload:true}" 屬性ui-sref-opts="{reload:true}"起到重新整理當前超連結路由的作用例:<a href="javaScript:void(0);" ui-sref-opts="{reload:true}">提交<

Android 重複解決

private static final int MIN_DELAY_TIME = 2000; // 兩次點選間隔不能少於2000ms private static long lastClickTime = System.currentTimeMillis();

UITapGestureRecognizer和UIButton事件衝突的解決辦法

問題描述:        檢視view上有一個UIButton例項btn,綁定了一個點選事件的響應方法buttonClicked:,由於某種需要(如點選空白區域收起鍵盤),為view添加了UITapGestureRecognizer手勢,關鍵程式碼如下: UITap

解決button多次重複

問題:button觸發一個ajax等待資料,短時間可以多次點選,然後ajax由於非同步,所以都會返回多次結果,進而出現多個彈框,理應只能點選一次,待返回資料之後,才能再次點選 解決:在button的回撥函式中加入標誌位(當然要求有點高,可能需要自己重寫alert、confi

react-navigation重複多次跳轉的解決方案

廢話 在[email protected]版本之後,官方廢棄了之前的導航Navigator,用react-navigation 替代 react-natvigation於2017年1月份開源,在3個月時間內,GitHub上star數達4000+,備

andorid 防快速重複的全域性設定

開發中,相信很多人都遇到重複提交的問題,很大部分情況是因為介面響應慢,前端點選事件未設定不可點選,導致使用者點選的時候出現連續點選多次的操作。也有的是因為點選的時候彈出loading圈,可是彈出的慢了,導致多次點選被響應。 這個時候我們可能想到的操作就是,在使用者點選的時候,將控制元件設定為不可

iOS runtime防止button連續事件

在我們平時iOS開發過程中經常使用按鈕,按鈕的點選事件使用場景眾多。但是我們很少注意到當你快速連續點選同一個按鈕的時候,會產生多次響應。 一般的處理方法: 在點選按鈕事件裡面,把button.enabled = NO,執行結束再設定為YES。這樣也能實現,但是每次都得設定,比較繁瑣。

android防重複

android防重複點選 簡介 程式碼實現 簡介 此方法侵入性小,使用方便,程式碼量少,基於AspectJ實現 先看使用方式 @SingleClick(2000) @Override public void onC

小程式可重複的按鈕(false和true)

程式碼如下 wxml: < view class= '{{san?"v1":"v2"}}' bindtap= "selectList"></ view >

解決ios10以上縮放的問題

禁止ios10以上點選縮放,程式碼如下: <script> window.onload=function () { document.addEventListener('touchstart',function (event) { if(e