最近在开发一个简单的功能时,被iOS11系统坑了一把,在此做个记录,后续尝试研究这个问题的解决方案
问题已解决,需要的小伙伴拿去
简单描述下问题:
有一个UIButton,需要同时监听UIControlEventTouchDown
和UIControlEventTouchUpInside
的事件响应,以便在长按时做相应的业务处理,这个button的定位是底部是对齐屏幕的底部。然后诡异的事情就发生了,button的上半部分能正常的速度响应这个touchdown的事件,而下半部分需要等待2s左右时间😢😢😢
然而这个问题按照正常的逻辑去排查原因的话你只会发现根本无法理解,本着探索的精神,接下来我经历了一段长时间懵逼的研究探索:
- 图层关系没问题,无遮挡无超出superview,而且事件也能响应,所以跟这个没什么关系
- 新建了一个button,做同样的响应处理,放在同一水平线上(对比之前的button看有没有隐藏的坑),然并卵
- 复制一模一样的button,放到靠上的位置,就正常了。。摸头中,难道我手机有问题,底部区域屏幕不太好用了?拿来另外一台手机测试,无果
到这里基本上确定了就是将button定位到底部区域才出现这样的问题,但一时间想不出个所以然,所以按以往的惯例,我碰到这种问题的做法都是,先睡一觉,明天就好了!
恩,今天就从调整frame入手,把button放在scrollview上,一点一点拖动看效果,最终发现是距离底部大概30pt的地方,蜜汁反应慢。。突然一下清醒,拿来上古时代的iphone5一测试,哈哈,哈哈。就是跟iOS系统有关啊。。具体的就不说啦,相信大家都知道是iPhoneX的底部手势区域,还没去做iPhoneX适配的我就这样踩进了这么个巨坑!!
12.14继续更新
在iPhoneX上Home Indicator
作为系统级别的手势,理论上不应该对非iPhoneX的iPhone手机造成影响,觉得这应该是被苹果所忽略的bug。但作为开发者怎么样也得把自己先把这个坑给填了。
解决办法很简单,WWDC 2017
之后对UIKit在iOS系统下新增了一些API,下面这个值得注意
这个方法表明了屏幕边缘的手势动作(Screen Edge Gesture),一般来说都是由系统管理的,在控制器下重写这个方法,可以让自己的手势优先被调用,在这里的遇到的实际情况,我们应该使用
UIRectEdgeBottom
这个枚举值,问题完美解决😁
2018.1.2更新 大家新年快乐~
近期有小伙伴反应说,以上方法放在自己项目里无效,今天花了些时间研究,基本上可以确定是开启了侧滑返回手势导致的,会发现屏幕的中间以左的底部区域还是无法正常工作,目前还没有完整的解决方案,可以考虑先禁用掉当前页面的返回手势,也同样能解决问题,看如何取舍吧,当然其他小伙伴有招的也可以支个招,毕竟此种方法也是指标不治本😊😊
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
网友评论