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

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

解決超出點(diǎn)擊區(qū)域的問(wèn)題
這種情況其實(shí)很有可能發(fā)生,舉個(gè)我碰到的栗子:聊天區(qū)域的高度小于鍵盤(pán)的高度,而輸入框是聊天區(qū)域的子View,在鍵盤(pán)彈出后,輸入框上移,而且超出了父視圖的frame,這個(gè)時(shí)候點(diǎn)擊紅框的按鈕切換表情鍵盤(pá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;
重寫(xiě)方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
這是View里的一個(gè)方法,處理流程如下
- 首先調(diào)用當(dāng)前視圖的pointInside:withEvent:方法判斷觸摸點(diǎn)是否在當(dāng)前視圖內(nèi);
- 若返回NO,則hitTest:withEvent:返回nil;
- 若返回YES,則向當(dāng)前視圖的所有子視圖(subviews)發(fā)送hitTest:withEvent:消息,所有子視圖的遍歷順序是從top到bottom,即從subviews數(shù)組的末尾向前遍歷,直到有子視圖返回非空對(duì)象或者全部子視圖遍歷完畢;
- 若第一次有子視圖返回非空對(duì)象,則hitTest:withEvent:方法返回此對(duì)象,處理結(jié)束;
- 如所有子視圖都返回非,則hitTest:withEvent:方法返回自身(self)。
- 最后,這個(gè)觸摸事件交給主窗口的hitTest:withEvent:方法返回的視圖對(duì)象去處理。
所以我們可以在返回nil時(shí)進(jìn)行處理,因?yàn)檫@個(gè)時(shí)候button是在父View外的
//返回一個(gè)view來(lái)響應(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)擊無(wú)響應(yīng)的解決辦法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家的支持!
相關(guān)文章
Android開(kāi)發(fā)中DatePicker日期與時(shí)間控件實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了Android開(kāi)發(fā)中DatePicker日期與時(shí)間控件,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-08-08
android startActivityForResult的使用方法介紹
android startActivityForResult的使用方法介紹,需要的朋友可以參考一下2013-05-05
Android HelloChart開(kāi)源庫(kù)圖表之折線圖的實(shí)例代碼
這篇文章主要介紹了Android HelloChart開(kāi)源庫(kù)圖表之折線圖的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Android把商品添加到購(gòu)物車(chē)的動(dòng)畫(huà)效果(貝塞爾曲線)
本篇文章介紹了Android把商品添加到購(gòu)物車(chē)的動(dòng)畫(huà)效果,這個(gè)在很多項(xiàng)目中都用的到,具有一定的參考價(jià)值,有需要的可以了解一下。2016-10-10
Android仿簡(jiǎn)書(shū)長(zhǎng)按文章生成圖片效果
使用簡(jiǎn)書(shū)APP的同學(xué)都知道,簡(jiǎn)書(shū)有這樣一個(gè)功能;文章頁(yè)長(zhǎng)按內(nèi)容時(shí)底部會(huì)出現(xiàn)一個(gè) 生成圖片分享 的按鈕,點(diǎn)擊之后就可以將當(dāng)前的文章生成一張長(zhǎng)圖片;這張圖片可以保存到本地或分享給好友,同時(shí)還可為圖片設(shè)置成為白和黑兩種風(fēng)格,很有藝術(shù)范2017-03-03
Android使用動(dòng)畫(huà)動(dòng)態(tài)添加商品進(jìn)購(gòu)物車(chē)
這篇文章主要為大家詳細(xì)介紹了Android使用動(dòng)畫(huà)動(dòng)態(tài)添加商品進(jìn)購(gòu)物車(chē),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android 逆向?qū)W習(xí)詳解及實(shí)例
本文主要介紹Android 逆向?qū)W習(xí),這里整理逆向?qū)W習(xí)的思路及學(xué)習(xí)要點(diǎn),并附示例代碼,幫助大家學(xué)習(xí)理解,有需要的小伙伴可以參考下2016-09-09
Android 實(shí)現(xiàn)自動(dòng)打電話與發(fā)短信的實(shí)例
這篇文章主要介紹了Android 實(shí)現(xiàn)自動(dòng)打電話與發(fā)短信的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
將cantk runtime嵌入到現(xiàn)有的APP中的方法
今天小編就為大家分享一篇關(guān)于將cantk runtime嵌入到現(xiàn)有的APP中的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12

