【问题标题】:hit testing filled area of UIView subclass命中测试 UIView 子类的填充区域
【发布时间】:2012-08-17 15:16:31
【问题描述】:

我有一些 UIView 子类,我在 drawRect 中绘制 UIBezierPaths。在添加这些视图的 viewController 中,我需要做一个点击测试,看看是否在 bezier 路径内发生了点击。我尝试在视图子类中创建一个 UIBezierPath 变量,然后对其进行测试。但是,当然,偏移量是完全错误的——我会在屏幕的上角得到点击,而不是在形状上。

谁能提出最好的方法来做到这一点?这有意义吗,还是我应该添加一些代码?

谢谢, 詹姆斯

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    这是我拥有的自定义三角形视图。它比贝塞尔路径简单得多,但我相信它应该工作得差不多。我还有一个类别,它基于每个像素的 alpha 级别进行命中测试,我将其用于具有 alpha 层的 UIImages。 (在这个帖子里Retrieving a pixel alpha value for a UIImage

    - (void)drawRect:(CGRect)rect
    {    
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        CGContextMoveToPoint(context, 0.0, 0.0);
        CGContextAddLineToPoint(context, rect.size.width, 0.0);
        CGContextAddLineToPoint(context, 0.0, rect.size.height);
        CGContextClosePath(context);
    
        CGContextSetFillColorWithColor(context, triangleColor.CGColor);
        CGContextFillPath(context);
    
        CGContextSaveGState(context);
    
        [self.layer setShouldRasterize:YES];
        [self.layer setRasterizationScale:[UIScreen mainScreen].scale];
    
    }
    
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        CGMutablePathRef trianglePath = CGPathCreateMutable();
        CGPathMoveToPoint(trianglePath, NULL, 0.0, 0.0);
        CGPathAddLineToPoint(trianglePath, NULL, self.frame.size.width, 0.0);
        CGPathAddLineToPoint(trianglePath, NULL, 0.0, self.frame.size.height);
        CGPathCloseSubpath(trianglePath);
    
    
        if (CGPathContainsPoint(trianglePath, nil, point, YES)) {
            CGPathRelease(trianglePath);
            return self;
        } else {
            CGPathRelease(trianglePath);
            return nil;
        }
    }
    

    【讨论】:

    • 感谢您的帮助。实际上,我认为我实际上并不是指“命中测试”,因为我不熟悉使用这些方法(我对 ObjC 很陌生)。我实际上想要做的只是向 touchesBegan 添加一个条件,它检查触摸是否发生在我在视图中绘制的路径内。有没有一种不涉及处理 hitTest 输出的简单方法?
    • 在 touchesBegan 中使用完全相同的逻辑。所有的代码都是一样的。
    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多