天天看點

關于iPhone邊緣觸摸延遲現象

初衷

這是在工作中遇到BUG,然後解決BUG的曆程。

希望我的思路及方向能對你有所啟發。

現象

遊戲在真機測試出現某些區域不響應的問題。

查原因

找回報者溝通

去了解具體發生的問題及有無任何規律等。

了解到隻在iPhone手機上才出現。

自己測試
  1. 黑盒

    方法:根據現象,進一步測試,打不同手機包等

    經過各種測試,總結出的特征如下:

    • 隻有iPhone手機有問題(測試過幾款Android手機 及 模拟器)
    • 隻有邊緣觸摸有問題(将觸摸區域移動過不同的位置)
    • 隻有iPhone 6s以上手機有問題
  2. 白盒

    方法:列印觸屏資訊等。

    發現 開始觸摸時并沒有列印,但是在結束觸摸時,開始觸摸喝結束觸摸同時相應。

    進一步列印,發現觸摸開始和結束在同一幀執行。

  3. 總結

    其實,在隻有 iPhone 6s 以上手機有問題就比較好确定了。

    經過調查發現 6s開始支援了 3D touch。

解決

既然發現3D touch有關,那就關閉3D touch看看效果。

關閉以後發現,左右兩邊沒有問題了,但是底邊還是有問題。

又了解到蘋果按住邊緣滑動,會滑出任務管理器,這個好像沒辦法關掉…

然後,就去cocos2d的github的issues看有沒有遇到同樣的問題的。

發現也有人遇到了同樣的問題,已經解決好了。 [ https://github.com/cocos2d/cocos2d-x/issues/18479 ]

解決方法就是将手勢識别的觸摸開始的延遲關掉。

在 AppController.mm 檔案内,

[window makeKeyAndVisible]; 之後

加入:

for(UIGestureRecognizer* gesture in window.gestureRecognizers)
{
    gesture.delaysTouchesBegan=NO;
}
           

完美解決問題。

真是查問題5小時,解決問題5秒鐘。

擴充

一般到這裡,解決完問題就結束了。

BUG是無窮盡的,但是它們是有共性的。

我們遇到一個問題,通過分析它能解決一類問題,這才是進步。

UIGestureRecognizer 是手勢識别器的基類。

它用于識别觸摸序列(或其他輸入)的邏輯進行解耦,并對該識别進行操作,負責發送操作消息或轉發觸摸消息等。

它主要有以下的手勢:

  • UITapGestureRecognizer [輕拍手勢]
  • UIPinchGestureRecognizer [捏合(縮放)手勢]
  • UIRotationGestureRecognizer [旋轉手勢]
  • UISwipeGestureRecognizer [輕掃手勢]
  • UIPanGestureRecognizer [平移手勢]
  • UIScreenEdgePanGestureRecognizer [螢幕邊緣平移手勢]
  • UILongPressGestureRecognizer [長按手勢]

如果視窗綁定了手勢識别器,觸摸事件會先經過手勢識别器處理,再傳遞給視圖。

如果手勢識别器識别了觸摸,則傳給視圖的其餘觸摸事件将會被取消。

它有三個主要的屬性:

  • cancelsTouchesInView

    如果手勢識别器識别出手勢,則從視圖中解除該手勢的其餘觸摸,進而使視窗不再傳遞它們。

  • delaysTouchesBegan

    隻要手勢識别器分析觸摸事件沒有失敗,視窗就會将UITouchPhaseBegan階段中的觸摸對象傳遞給視圖。如果随後識别手勢,則視圖不接收這些觸摸對象。

  • delaysTouchesEnded

    隻要手勢識别器分析觸摸事件沒有失敗,視窗就會将UITouchPhaseEnded階段中的觸摸對象傳遞給視圖。如果随後識别手勢,則觸摸被取消。

更詳細的可以看 參考資料3

總結

遇到問題 -> 分析&總結特征 -> 解決問題 -> 擴充問題

針對同一個問題,學到的比其他人更多更廣,長期以來,必将更進一步。

參考資料

  1. stackoverflow - TouchesBegan delay on left hand side of the display

    [https://stackoverflow.com/questions/39998489/touchesbegan-delay-on-left-hand-side-of-the-display]

  2. stackoverflow - Swift SpriteKit 3D Touch and touches moved

    [https://stackoverflow.com/questions/36060423/swift-spritekit-3d-touch-and-touches-moved]

  3. 蘋果開發者 UIGestureRecognizer [https://developer.apple.com/documentation/uikit/uigesturerecognizer?changes=_4&language=objc]