在开发的过程中你会发现 self.tabBarController.tabBar.hidden = YES;之后,位于tabBar位置上的按钮不能响应了。
先看一下view hierarchy,发现viewController的view并没有覆盖到navigationBar和tabBar.
图一如果你的情况类似,那么答案就在下面。
此时问题可以分为两个:1.viewController的view为什么没有填充整个屏幕 2.view以外的子view控件如何响应
问题1: iOS7 viewController增加了edgesForExtendedLayout这个属性。
图二这个属性的值是一个枚举:
图三默认为:UIRectEdgeAll,这个时候viewController的view是填充整个屏幕的。但是如果你的代码里有:
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
那么就会出现图一的情况,这个时候你应该对图三的枚举值有一定的理解了。
问题2: 子view添加在父view 以外的区域了。这个时候如果你设置self.view.clipsToBounds = YES; 父view以外的子view将不再显示,图四带官方描述。
图四这种情况你可以增大父view的大小以至于让他包含所有子view,也可以把子 view从新放在父view里。这些方法不做展示。这里推荐一种不破坏UI设计的情况下,合理的解决方案。
使用 - (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event; 方法,图五带官方定义:
图五他的作用是利用递归的方法找到父view含有这个点击点,并且层级最高的view来响应事件。
所以我的做法是:
在viewController中替换它原本的view:
图六然后在QYBaseView中覆盖- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;
图七用此方法,找到被添加在父view以外的子view,来响应此次的点击事件。
网友评论