我有一个带有可以接收触摸的图层蒙版(小于其框架)的UIView 。现在问题是我想限制图层蒙版中的这些触摸。
蒙版是一个渲染的形状,并不总是一个矩形。
我必须这样做吗:
pointInside:withEvent:
或者
hitTest:withEvent:
还是有更好的解决方案?
它有点老问题,但也许对某人有用:)
在您的意见 .h 文件中;
@interface CustomPhotoFrame : UIView {
@protected
CGPathRef borderPath;
}
@property (nonatomic, assign) CGPathRef borderPath;
而且,在您的 .m 文件中;
@synthesize borderPath;
- (void)setClippingPath:(CGPathRef)path
{
CGPathRelease(borderPath);
borderPath = path;
CGPathRetain(borderPath);
}
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
return CGPathContainsPoint(borderPath, NULL, point, FALSE);
}
在你drawrect方法;称呼;
UIBezierPath *aPath = [UIBezierPath bezierPath];
// your path codes.. assume that its a circle;
aPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(centeredCircleRect)];
CGPathRef cgPath = CGPathCreateCopy(aPath.CGPath);
[self setClippingPath:cgPath];
现在您的触摸方法仅检测您的触摸是否在圆形蒙版视图中。
通过创建一种方法来解决该问题,该方法检查图层中特定位置是否存在实心或透明像素:
- (BOOL)isSolidPixel:(CGImageRef)image withXPosition:(int)xPos andYPosition:(int)yPos {
if(xPos > CGImageGetWidth(image) || yPos > CGImageGetHeight(image))
return NO;
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image));
const UInt8* data = CFDataGetBytePtr(pixelData);
int pixelInfo = yPos * CGImageGetBytesPerRow(image) + xPos * 4;
UInt8 alpha = data[pixelInfo];
CFRelease(pixelData);
if (alpha)
return YES;
return NO;
}