初衷
這是在工作中遇到BUG,然後解決BUG的曆程。
希望我的思路及方向能對你有所啟發。
現象
遊戲在真機測試出現某些區域不響應的問題。
查原因
找回報者溝通
去了解具體發生的問題及有無任何規律等。
了解到隻在iPhone手機上才出現。
自己測試
-
黑盒
方法:根據現象,進一步測試,打不同手機包等
經過各種測試,總結出的特征如下:
- 隻有iPhone手機有問題(測試過幾款Android手機 及 模拟器)
- 隻有邊緣觸摸有問題(将觸摸區域移動過不同的位置)
- 隻有iPhone 6s以上手機有問題
-
白盒
方法:列印觸屏資訊等。
發現 開始觸摸時并沒有列印,但是在結束觸摸時,開始觸摸喝結束觸摸同時相應。
進一步列印,發現觸摸開始和結束在同一幀執行。
-
總結
其實,在隻有 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
總結
遇到問題 -> 分析&總結特征 -> 解決問題 -> 擴充問題
針對同一個問題,學到的比其他人更多更廣,長期以來,必将更進一步。
參考資料
-
stackoverflow - TouchesBegan delay on left hand side of the display
[https://stackoverflow.com/questions/39998489/touchesbegan-delay-on-left-hand-side-of-the-display]
-
stackoverflow - Swift SpriteKit 3D Touch and touches moved
[https://stackoverflow.com/questions/36060423/swift-spritekit-3d-touch-and-touches-moved]
- 蘋果開發者 UIGestureRecognizer [https://developer.apple.com/documentation/uikit/uigesturerecognizer?changes=_4&language=objc]