美文网首页
iOS点击响应的控制

iOS点击响应的控制

作者: 陈大帅 | 来源:发表于2021-08-26 11:25 被阅读0次

    第一种:一个view的子控件部分在view的范围外,要点击响应范围外的这部分要用到:

    /**
     close按钮是添加在view里面,但是有一部分超出了绿色view的范围。默认情况下点击view区域外的按钮部分,close按钮是不会有任何响应的。接下来我通过重写- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event方法来让点击close按钮任何一个地方都能响应
     */
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
        if (self.userInteractionEnabled == NO || self.isHidden || self.alpha <= 0.01) {
            //这三种情况不能响应事件
            return nil;
        }
        
        //往前遍历子控件
        for (NSInteger i = self.subviews.count - 1; i >= 0; i--) {
            UIView *subView = self.subviews[i];
            //把点的坐标转换成子控件的坐标
            CGPoint newPoint = [self convertPoint:point toView:subView];
            if ([subView hitTest:newPoint withEvent:event]) {
                //找到最合适的view
                return subView;
            }
        }
        return [super hitTest:point withEvent:event];
    }
    

    第二种:一个view点击的时候要响应自己还是哪个子控件的时候,要用到:

    //判断一个点是否在某个范围内
    -(BOOL)point:(CGPoint)point IsInFrame:(CGRect)frame{
        
        CGMutablePathRef pathRef=CGPathCreateMutable();
        CGPathMoveToPoint(pathRef, NULL, frame.origin.x, frame.origin.y);
        CGPathAddLineToPoint(pathRef, NULL, frame.origin.x, frame.origin.y + frame.size.height);
        CGPathAddLineToPoint(pathRef, NULL, frame.origin.x + frame.size.width, frame.origin.y + frame.size.height);
        CGPathAddLineToPoint(pathRef, NULL, frame.origin.x + frame.size.width, frame.origin.y);
        CGPathAddLineToPoint(pathRef, NULL, frame.origin.x, frame.origin.y);
        CGPathCloseSubpath(pathRef);
        
        if (CGPathContainsPoint(pathRef, NULL, point, NO))
        {
            DLog(@"point in path!");
            return YES;
        }
    
        DLog(@"outPoint out path!");
        return NO;
    }
    
    /**
      让点击响应那个按钮
     */
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
        
        BOOL isLikePoint = [self point:point IsInFrame:self.like.frame];
        if (isLikePoint) {
            return self.like;
        }
        
        BOOL isAvtorPoint = [self point:point IsInFrame:self.avatorView.frame];
        if (isAvtorPoint) {
            return self.avatorView;
        }
        
        BOOL isCommentPoint = [self point:point IsInFrame:self.comment.frame];
        if (isCommentPoint) {
            return self.comment;
        }
        
        return [super hitTest:point withEvent:event];
    }
    
    

    相关文章

      网友评论

          本文标题:iOS点击响应的控制

          本文链接:https://www.haomeiwen.com/subject/skayiltx.html