使用系统的navigationBar的时候,它下面如果有其他控件,对这些控件进行触摸时,往往响应的时navigationBar。比如wyx遇到的问题,比如dave遇到的问题


这是因为iPhone自带的控件NavigationBar上的Button、TabBar上的Item、ToolBar上的ButtonItem,实际的点触区域都是被放大了的。

B2B395D3-43A9-4E47-8297-D4A83DDFABE9

虽然iPhone导航栏上的操作按钮仅有29px高,但是它的实际点触区域比整个导航栏的高度还要高出5px左右,大概能达到44px+5px。


解决方案:

  1. 自定义navigationBar,Foursquare和USA today等应用最后都是采用自定义TabBar的方式规避问题的。
  2. 去掉navigationBar的多出的5px的触屏事件,并给出该5px应该对应的控件触屏事件
  3. 让点击的位置为实际位置,不要漂移(相对上面解决方案要简单很多,但局限于企业内发布的App)

接下来解析第二种方式,stackoverflow中也有部分解决方法,可参考

  • 去掉navigationBar多出5px区域的交互:新建一个CustomNavigationBar继承UINavigationBar重写hitTest方法

到这一步,可以发现点击navigationBar下5px的区域,不再触发navigationBar的响应。同时也可以发现点击该区域也不会触发该区域中其他控件的操作。所以接下来要给该区域添加对应的触摸事件。

  • 获取window触摸事件,新建CustomWindow继承UIWindow,重写sendEvent方法

  • 将AppDelegate中的UIWindow替换成CustomWindow

这样CustomWindow中可以获取到触摸位置,做出相应的控件事件就OK了

比如通过位置判断做delegate:


第三种方式,stackoverflow中有部分解释,可参考

新建CustomWindow继承UIWindow,重写warpPoint方法,让点击的位置不漂移。

但是如果你的app需要发布到App Store,因为warpPoint是私有方法,会被App Store拒绝掉。所以重写warpPoint的这种解决方案只针对企业内部的App使用

 

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注