我最近问了一个关于在view的drawRect方法中通过路径剪切图像的问题。
Krasnyk的代码复制如下。
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGMutablePathRef path = CGPathCreateMutable();
//or for e.g. CGPathAddRect(path, NULL, CGRectInset([self bounds], 10, 20));
CGPathAddEllipseInRect(path, NULL, [self bounds]);
CGContextAddPath(context, path);
CGContextClip(context);
CGPathRelease(path);
[[UIImage imageNamed:@"GC.png"] drawInRect:[self bounds]];
}
效果很好。但是,当我的图像比视图本身大时,如何显示图像的不同部分?
我尝试在椭圆和/或UIImage drawInRect的位置(显示为上边界)上进行平移,但是我无法解释一些复杂的效果(不需要的剪裁,奇怪的椭圆尺寸)。
当我绘制一个比通过视图显示的更大的矩形时,是否会导致性能损失?
答案 0 :(得分:2)
听起来你已经为自己想出来了。 drawAtPoint是你应该使用的。 drawInRect将缩放图像以适合目标rect,这在计算上更昂贵。假设您的图像大于您的视图,您将把负x和y值传递给drawAtPoint,以便剪切图像的内部部分。
以下示例应在您的视图中显示图像的中心部分:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, [self bounds]);
CGContextAddPath(context, path);
CGContextClip(context);
CGPathRelease(path);
UIImage *bigImage = [UIImage imageNamed:@"GC.png"];
CGPoint topLeftOffset = CGPointMake((self.bounds.size.width - bigImage.size.width) / 2,(self.bounds.size.height - bigImage.size.height) / 2);
[bigImage drawAtPoint: topLeftOffset];
}