iOS UIButton 點擊無響應的解決辦法
前言
在日常開發(fā)中我們經(jīng)常和按鈕打交道,但是有時候會碰到比較難處理的問題,就是按鈕不響應點擊事件,這時候我們需要從下面幾方面排查
按鈕不響應的原因
1、按鈕添加到了一個沒有開啟用戶交互的父View上,例如UIImageView,這時候開啟父試圖的交互 view.userInteractionEnabled = YES
設為YES就可以解決問題
2、按鈕自身被遮擋,點擊的時候根本就沒有點擊到button,而是他上面一層View,自然就不會響應
這里有個看圖層的方法,下圖點擊那個紅框的按鈕就可以看到當前運行界面的UI元素,你可以看到有沒有view遮擋住button
3、按鈕的frame超出了父視圖的frame,這個是最容易出現(xiàn)的,按鈕的freme必須在父視圖的frame內(nèi)部點擊才有效,如下圖,按鈕點擊紅框里的區(qū)域是不響應的。
如果碰到這個問題怎么辦呢,請繼續(xù)往下看
解決超出點擊區(qū)域的問題
這種情況其實很有可能發(fā)生,舉個我碰到的栗子:聊天區(qū)域的高度小于鍵盤的高度,而輸入框是聊天區(qū)域的子View,在鍵盤彈出后,輸入框上移,而且超出了父視圖的frame,這個時候點擊紅框的按鈕切換表情鍵盤動作就不響應。
解決辦法
這里有兩個方法,每次有touch動作時,都會走這兩個方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
重寫方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
這是View里的一個方法,處理流程如下
- 首先調(diào)用當前視圖的pointInside:withEvent:方法判斷觸摸點是否在當前視圖內(nèi);
- 若返回NO,則hitTest:withEvent:返回nil;
- 若返回YES,則向當前視圖的所有子視圖(subviews)發(fā)送hitTest:withEvent:消息,所有子視圖的遍歷順序是從top到bottom,即從subviews數(shù)組的末尾向前遍歷,直到有子視圖返回非空對象或者全部子視圖遍歷完畢;
- 若第一次有子視圖返回非空對象,則hitTest:withEvent:方法返回此對象,處理結(jié)束;
- 如所有子視圖都返回非,則hitTest:withEvent:方法返回自身(self)。
- 最后,這個觸摸事件交給主窗口的hitTest:withEvent:方法返回的視圖對象去處理。
所以我們可以在返回nil時進行處理,因為這個時候button是在父View外的
//返回一個view來響應事件 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ UIView *view = [super hitTest:point withEvent:event]; if (view == nil){ //轉(zhuǎn)換坐標 CGPoint tempPoint = [self.testBtn convertPoint:point fromView:self]; //判斷點擊的點是否在按鈕區(qū)域內(nèi) if (CGRectContainsPoint(self.testBtn.bounds, tempPoint)){ //返回按鈕 return _testBtn; } } return view; }
這個時候按鈕在區(qū)域外點擊也有效果了
總結(jié)
以上所述是小編給大家介紹的iOS UIButton 點擊無響應的解決辦法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家的支持!
相關文章
Android游戲開發(fā)學習②焰火綻放效果實現(xiàn)方法
這篇文章主要介紹了Android游戲開發(fā)學習②焰火綻放效果實現(xiàn)方法,以實例形式詳細分析了Android中粒子對象類Particle類和粒子集合類ParticleSet類及物理引擎ParticleThread類 的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10Android中l(wèi)istview嵌套scrollveiw沖突的解決方法
這篇文章主要為大家詳細介紹了Android中l(wèi)istview嵌套scrollveiw沖突的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01Android 調(diào)用notifyDataSetChanged方法失敗解決辦法
這篇文章主要介紹了Android 調(diào)用notifyDataSetChanged方法失敗解決辦法的相關資料,需要的朋友可以參考下2017-07-07Android Studio preview 不固定及常見問題的解決辦法
preview 可以幫助您預覽您的布局文件將如何在用戶的設備上呈現(xiàn)。這篇文章主要介紹了Android Studio preview 不固定及常見問題的解決辦法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05Android入門之ViewFlipper翻轉(zhuǎn)視圖的使用詳解
本篇給大家?guī)Я说氖荲iewFlipper,它是Android自帶的一個多頁面管理控件,且可以自動播放!本篇我們我們會使用兩個例子:一個自動播放首頁輪播頁一個手動可左右滑動道頁的輪播頁來說透這個組件的使用,感興趣的可以了解一下2022-11-11