用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