解决超出父视图范围的子视图响应点击/手势等事件时,使用到以下方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
代码及分析参考以下网址
让超出父视图范围的子视图响应事件,在UIView范围外响应点击
如果一个button有一部分超出父控件的范围了,这部分无法响应点击,如果想让它响应点击应该怎么做
具体代码
//重写该方法后可以让超出父视图范围的子视图响应事件
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
if (view == nil) {
for (UIView *subView in self.subviews) {
CGPoint tp = [subView convertPoint:point fromView:self];
if (CGRectContainsPoint(subView.bounds, tp)) {
view = subView;
}
}
}
return view;
}
但是我在不响应点击的按钮的父视图中重写了该方法,发现点在父视图范围外根本就不走这个方法.
层级是这样的.
[self.view addSubView:containerView];
[containerView addSubView:AView]; //AView上有超出AView范围的Button
对于位置和大小,containerView和AView是完全重叠的(即两控件bounds相同)
找了很久原因,发现是因为Button不仅仅超出了父视图(即AView)的范围,同时不在父视图的父视图(即containerView)的范围内,所以不走hitTest:withEvent:方法.
解决办法:
改了一下视图层级结构
[self.view addSubView:containerView];
[self.view addSubVIew:AView]; //AView上有超出AView范围的Button
(这样的话想让两个View完全重叠就设置为相同的frame即可)
这样containerView和AView的父视图都是控制器的view,再点击超出AView范围的Button,就会执行hitTest:withEvent:方法了.
其他需要考虑的,也有可能是按钮的确很小,可以给按钮设置一个背景颜色,然后看看按钮响应事件的范围(layer/宽高)是否合理.
网友评论