实现button只有内切圆响应点击事件 为什么重写hittest

来源:3-3 UI事件传递&响应 相关面试问题

慕UI9212626

2020-12-27

只实现point那个方法不行吗,hit test方法不是默认调用point方法的吗

写回答

3回答

慕UI9212626

提问者

2021-05-20

老师,您说是为了,不在内切圆的范围内,要能把事件传递出去?这句话是什么意思呢。意思是,如果只重写pointinside 而不重写hittest方法就传递不出去了吗。我看你重写的hittest方法和前面讲的hittest系统实现那个图里逻辑是一模一样的,没看出来重写hittest和系统的默认实现的区别,重写pointinside能明白,还是没明白为啥还要重写hittest。请老师解答下 谢谢

1
0

卷王Charles

2021-10-10

如下场景中需要重写 hitTest。

我搜索了下我们App的代码(开发了有好几年的App了),实际没有重写过hitTest,大多数场景重写pointInSide:withEvent即可

点击下图中红色箭头所指的区域,如果让视图2(黄色区域)来响应,需要重写视图1的hitTest方法来返回视图2。代码如下:

//View1中 hitTest
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    __block UIView *view = nil;
    [self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj isKindOfClass:[View2 class]] && [obj pointInside:point withEvent:event]) {
            view = obj;
        }
    }];
    return view;
}

//img.mukewang.com/szimg/6162b67009fb754e07081644.jpg


0
0

于海

2021-01-10

在实际应用场景下,不在内切圆的部分要能把事件透传出去

0
1
慕UI9212626
老师,您说是为了,不在内切圆的范围内,要能把事件传递出去?这句话是什么意思呢。意思是,如果只重写pointinside 而不重写hittest方法就传递不出去了吗。我看你重写的hittest方法和前面讲的hittest系统实现那个图里逻辑是一模一样的,没看出来重写hittest和系统的默认实现的区别,重写pointinside能明白,还是没明白为啥还要重写hittest。请老师解答下 谢谢
2021-05-20
共1条回复

资深大牛带你深度剖析ios高级面试

从BAT/TMD名企真题入手,结合源码及应用,构建完整iOS知识体系

1749 学习 · 600 问题

查看课程