在开发中遇到这样一个问 题,自定义的导航栏左键,在 IOS11以后很难点击中,很影响用户体验,经过分析以及参考其他内容后,暂时解决;
问题原因分析:引用参考里的图片:
IOS11之前:
是上面的结构,虽然,UIButton起点也是在20像素,但是因为其中"_UINavigationBarBackIndicatorView",在视图中是透明的,占了前面12像素空间,而神奇的是,点击前面的空间相当于 点击了这个_UINavigationBarBackIndicatorView,这个会响应 自定义的back事件,因此IOS11以下点击左边空白区域是能响应的.
IOS11之后:_UINavigationBarBackIndicatorView,没了,等于前面的20像素真的是空白了,而一般人都会按左上角边缘区域,因为给人很难点击的感觉;
解决目标:让用户点击左边20像素时也能响应消息;
解决方法:旧有的FIXEDSPACE不行了,这也是搜索中找到的最常办法,参考文中的方法,1写一个自己的UIViewController,处理相关内容:
1.(可选),根据是否11以上扩大点击区域,我的点击区域目标是0-84,IOS11以下我设的是64,那么IOS11以上设成84,因为要左移20像素;
2.必要,改变Stack的起始位置
2.1通过约束去修改,直接改坐标,会在pushViewControler 时恢复.调用时机:
-(void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[self resetLeftBtnX];
}
2.2 当popViewControllerAnimated时会恢复,看其他同行的文章,说在viewWillAppear中加入,试过不行,而且返回时不调用:viewDidLayoutSubviews,暂时的解决办法:在viewWillAppear中,强制重新layout,暂时解决;
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
if(IS_IOS_11_PLUS) {
[self.view setNeedsLayout];
}
}
由于我只是改点击,所以只要上述操作就可以了.这样,前面的20像素也能响应点击事件了.
参考:
https://www.jianshu.com/p/383cdad95a32
https://blog.csdn.net/spicyshrimp/article/details/78201042
https://blog.csdn.net/spicyShrimp/article/details/77891717