- (UIView *)hitTest:(CGPoint)poi

2018-08-09  本文已影响0人  Accepted_

解决超出父视图范围的子视图响应点击/手势等事件时,使用到以下方法

- (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/宽高)是否合理.

上一篇下一篇

猜你喜欢

热点阅读