UIButton上覆盖UIView,点击UIView后UIButton还能响应事件

根据响应链传递在hitTest方法中返回接受事件的视图即可,在自定义的button中重写hitTest方法,其中view==nil表示当前点击的是超出button的子视图view区域,再通过遍历button的子视图subviews,找到其中的UIView即可。反过来UIView上覆盖UIButton,在UIView中重写hitTest方法,把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 p = [subView convertPoint:point fromView:self];
            if (CGRectContainsPoint(subView.bounds, p)) {
                return self;
            }
        }
    }
    return view;
}
或者直接一点,把子view当做参数传进来查找,看点击区域是否在view上
@interface TempButton : UIButton

@property (nonatomic, strong) TempView *tempView;

@end
#import "TempButton.h"

@implementation TempButton

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *view = [super hitTest:point withEvent:event];
    if (view == nil) {
        CGPoint p = [self.tempView convertPoint:point fromView:self];
        if (CGRectContainsPoint(self.tempView.bounds, p)) {
            return self;
        }
    }
    return view;
}

@end
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容