前言
在日常開發(fā)中我們經(jīng)常和按鈕打交道,但是有時(shí)候會(huì)碰到比較難處理的問題,就是按鈕不響應(yīng)點(diǎn)擊事件,這時(shí)候我們需要從下面幾方面排查
按鈕不響應(yīng)的原因
1、按鈕添加到了一個(gè)沒有開啟用戶交互的父View上,例如UIImageView,這時(shí)候開啟父試圖的交互 view.userInteractionEnabled = YES
設(shè)為YES就可以解決問題
2、按鈕自身被遮擋,點(diǎn)擊的時(shí)候根本就沒有點(diǎn)擊到button,而是他上面一層View,自然就不會(huì)響應(yīng)
這里有個(gè)看圖層的方法,下圖點(diǎn)擊那個(gè)紅框的按鈕就可以看到當(dāng)前運(yùn)行界面的UI元素,你可以看到有沒有view遮擋住button

3、按鈕的frame超出了父視圖的frame,這個(gè)是最容易出現(xiàn)的,按鈕的freme必須在父視圖的frame內(nèi)部點(diǎn)擊才有效,如下圖,按鈕點(diǎn)擊紅框里的區(qū)域是不響應(yīng)的。
如果碰到這個(gè)問題怎么辦呢,請(qǐng)繼續(xù)往下看

解決超出點(diǎn)擊區(qū)域的問題
這種情況其實(shí)很有可能發(fā)生,舉個(gè)我碰到的栗子:聊天區(qū)域的高度小于鍵盤的高度,而輸入框是聊天區(qū)域的子View,在鍵盤彈出后,輸入框上移,而且超出了父視圖的frame,這個(gè)時(shí)候點(diǎn)擊紅框的按鈕切換表情鍵盤動(dòng)作就不響應(yīng)。

解決辦法
這里有兩個(gè)方法,每次有touch動(dòng)作時(shí),都會(huì)走這兩個(gè)方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
重寫方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
這是View里的一個(gè)方法,處理流程如下
所以我們可以在返回nil時(shí)進(jìn)行處理,因?yàn)檫@個(gè)時(shí)候button是在父View外的
//返回一個(gè)view來響應(yīng)事件- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ UIView *view = [super hitTest:point withEvent:event]; if (view == nil){ //轉(zhuǎn)換坐標(biāo) CGPoint tempPoint = [self.testBtn convertPoint:point fromView:self]; //判斷點(diǎn)擊的點(diǎn)是否在按鈕區(qū)域內(nèi) if (CGRectContainsPoint(self.testBtn.bounds, tempPoint)){ //返回按鈕 return _testBtn; } } return view;}這個(gè)時(shí)候按鈕在區(qū)域外點(diǎn)擊也有效果了
總結(jié)
以上所述是小編給大家介紹的iOS UIButton 點(diǎn)擊無響應(yīng)的解決辦法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)的支持!
新聞熱點(diǎn)
疑難解答
圖片精選