在Xcode / objective-c中将图像绘制到两个同心圆之间的区域

时间:2012-02-11 20:43:30

标签: objective-c image cocoa-touch geometry masking

我有一个图像(它实际上是圆形的),并希望只绘制与两个同心圆之间的区域相对应的图像部分,外部的一个是固定的,内部的可以调整大小。

外同心圆将始终对应于图像的外边缘 - 但需要在绘制的图像中留下“洞” - 对应于较小的同心圆的大小。

我正在尝试在iOS的objective-c中执行此操作 - 绘制可变大小的“取景器”控件。

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:3)

听起来像使用CGContextEOClip的标准情况。没有检查过这段代码,但是有点像:

CGContextRef ctxt = UIGraphicsGetCurrentContext();
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, outerCircle);
CGPathAddEllipseInRect(path, NULL, innerCircle);
CGContextEOClip(ctxt);
//Draw your stuff

答案 1 :(得分:1)

最简单,最高效的解决方案可能是使用UIImageView并应用CAShapeLayer作为其图层的掩码。

示例:

UIImage *image = ...;
CGFloat ringWidth = 20.0;
CGRect outerCircleRect = CGRectMake(0, 0, image.size.width, image.size.height);
CGRect innerCircleRect = CGRectInset(outerCircleRect, ringWidth, ringWidth);
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:outerCircleRect];
[path appendPath:[UIBezierPath bezierPathWithOvalInRect:innerCircleRect]];
CAShapeLayer *shapeLayer = [CAShapeLayer layer];
shapeLayer.fillRule = kCAFillRuleEvenOdd;
shapeLayer.path = [path CGPath];
UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
imageView.layer.mask = shapeLayer;
[self.view addSubview:imageView];

您必须包含QuartzCore框架才能实现此目的。

更改内圆的半径时,可以简单地为形状图层指定新路径。这甚至可以动画。