给定一个绘制到上下文然后转换为CGImageRef的路径,我将如何剪切上下文(其中提供了一个提供的前景图像),以便所述上下文被CGImage屏蔽(之前是一条路径)?
如果不完全清楚,下面的问题代码应该更好地说明我的观点。请注意,所有这些都是在UIView的drawRect:方法中调用的,而scaledImageRectangle(UIImage * image,CGRect rect)函数只返回一个矩形。
// Close the path
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFillStroke);
// Mask the image
CGImageRef mask = CGBitmapContextCreateImage(context);
[foregroundImage drawInRect:scaledImageRectangle(foregroundImage, rect)];
CGContextClipToMask(context, scaledImageRectangle(foregroundImage, rect), mask);
// Finally draw the masked image
UIImage *maskedImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
[maskedImage drawInRect:scaledImageRectangle(foregroundImage, rect)];
例如,这是一个黑色笔划代表路径的图像
这是掩盖时图像的样子
答案 0 :(得分:4)
我可能倾向于在触摸进入时构建路径(我使用UIBezierPath
),然后您的自定义视图可以使用该路径来剪切图像,以及用于抚摸剪切的路径图像:
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
if (self.isClipped) {
CGContextAddPath(context, [self.path CGPath]);
CGContextClip(context);
}
[self.image drawInRect:self.bounds];
CGContextRestoreGState(context);
[[UIColor blackColor] setStroke];
self.path.lineWidth = 4.0;
[self.path stroke];
}
如果你想在触摸时绘制路径,我个人会通过单独的CAShapeLayer
渲染它(以避免不必要的重绘图像)。