iOS 时间事件传递过程探究

自定义View半径区域可点击效果

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{

    if (!self.userInteractionEnabled ||

        [self isHidden] ||

        self.alpha <= 0.01) {

        return nil;

    }

     if ([self pointInside:point withEvent:event]) {

        //遍历当前对象的子视图

        __block UIView *hit = nil;

        [self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

            // 坐标转换

            CGPoint vonvertPoint = [self convertPoint:point toView:obj];

            //调用子视图的hittest方法

            hit = [obj hitTest:vonvertPoint withEvent:event];

            // 如果找到了接受事件的对象,则停止遍历

            if (hit) {

                *stop = YES;

            }

        }];

           if (hit) {

            return hit;

        }

        else{

            return self;

        }

    }

    else{

        return nil;

    }

}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{

    CGFloat x1 = point.x;

    CGFloat y1 = point.y;

    CGFloat x2 = self.frame.size.width / 2;

    CGFloat y2 = self.frame.size.height / 2;

    double dis = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));

    if (dis <= self.frame.size.width / 2) {

        return YES;

    }

    else{

        return NO;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值