我有一些 UIView 子类,我在 drawRect 中绘制 UIBezierPaths。在添加这些视图的 viewController 中,我需要做一个点击测试,看看是否在贝塞尔路径内发生了点击。我尝试在视图子类中创建一个 UIBezierPath 变量,然后对其进行测试。但是,当然,偏移是完全错误的——我会在屏幕的上角得到点击,而不是在形状上。
谁能建议最好的方法来做到这一点?这有意义吗,还是我应该添加一些代码?
谢谢,詹姆斯
我有一些 UIView 子类,我在 drawRect 中绘制 UIBezierPaths。在添加这些视图的 viewController 中,我需要做一个点击测试,看看是否在贝塞尔路径内发生了点击。我尝试在视图子类中创建一个 UIBezierPath 变量,然后对其进行测试。但是,当然,偏移是完全错误的——我会在屏幕的上角得到点击,而不是在形状上。
谁能建议最好的方法来做到这一点?这有意义吗,还是我应该添加一些代码?
谢谢,詹姆斯
这是我拥有的自定义三角形视图。它比贝塞尔路径简单得多,但我相信它应该工作得差不多。我还有一个类别,它基于每个像素的 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;
}
}