iOS UIButton放到頁面底部延遲響應touchDown事件

第1部分:說明

最近在作一個相似微信語音聊天的功能,在屏幕的底部放一個Button,按下時能夠語音說話,鬆開時將語音發出去。可是作的過程當中遇到一個坑:按鈕放到頁面最底部的時候會延遲touchDown事件。ios

第2部分:解決步驟

  1. 在網上找了一些回答,好多都是說受到TableView或ScrollView的影響,但嘗試去掉TableView後依然沒有解決。
  2. 考慮是否是UI層級太深,影響到事件的響應,嘗試減小到一個層級後依賴無效。
  3. 後來乾脆新建了一個UIViewController,頁面上只放了一個UIButton,去掉任何多餘的代碼(這樣能夠不排隊其它因素的干擾)發現仍是有問題。
  4. 設想是否是Button只放到底部纔有問題,果斷嘗試將Button放到屏幕的上面、中間、下面測試,發現只有有下面的會延遲touchDown。又嘗試將該按鈕往上移動一點點,發現往上移動二三十的距離的時候就沒有問題了。這個時候果斷猜想是系統的一個坑。
  5. 通過了解是WWDC 2017以後對UIKit在iOS系統下新增了一些API:
- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(watchos, tvos);
  • 1

該方法表示屏幕邊緣的手勢動做(Screen Edge Gesture),通常來講都是由系統管理的,在控制器下重寫這個方法,可讓本身的手勢優先被調用。微信

第3部分:最終解決方案

很簡單,在你的UIViewController中重寫該方法,添加如下代碼便可。測試

- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures {
    return UIRectEdgeBottom;
}
  • 1
  • 2
  • 3

第4部分:總結

感受這應該是蘋果在開發時忽略的一個bug,雖然最終要解決它不是很複雜,可是找到解決方案仍是耗費了很多時間,這樣的問題還真的是挺坑的,在此記錄一下。spa

--------------------- 本文來自 Eric_HYD 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/haha223545/article/details/80259217?utm_source=copy.net

相關文章
相關標籤/搜索