tabbar隐藏后,其位置上的按钮不响应

在开发的过程中你会发现 self.tabBarController.tabBar.hidden = YES;之后,位于tabBar位置上的按钮不能响应了。

先看一下view hierarchy,发现viewController的view并没有覆盖到navigationBar和tabBar.

tabbar隐藏后,其位置上的按钮不响应_第1张图片
图一

如果你的情况类似,那么答案就在下面。

此时问题可以分为两个:1.viewController的view为什么没有填充整个屏幕 2.view以外的子view控件如何响应

问题1: iOS7 viewController增加了edgesForExtendedLayout这个属性。

图二

这个属性的值是一个枚举:

tabbar隐藏后,其位置上的按钮不响应_第2张图片
图三

默认为: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:

tabbar隐藏后,其位置上的按钮不响应_第3张图片
图六

然后在QYBaseView中覆盖- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;

tabbar隐藏后,其位置上的按钮不响应_第4张图片
图七

用此方法,找到被添加在父view以外的子view,来响应此次的点击事件。

你可能感兴趣的:(tabbar隐藏后,其位置上的按钮不响应)