天天看点

关于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]