在Xcode/Objective-C中将图像绘制在两个同心圆之间的区域内。

3
我有一张图片(实际上是圆形的),希望只绘制该图像对应于两个同心圆之间区域的部分,外部的同心圆是固定的,而内部的同心圆可以调整大小。
外部同心圆始终对应于图像的外边缘 - 但需要在绘制的图像中留下一个“孔”,与较小的同心圆的大小相对应。
我正在尝试在iOS的objective-c中完成此操作 - 绘制可变大小的“取景器”控件。
非常感谢任何帮助。

就此而言,一个内部切出圆形的圆盘的术语是“环形体”。 - Benjohn
2个回答

3
听起来使用CGContextEOClip是标准的情况。我没有检查过这段代码,但类似如下:

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

您需要使用 CGContextEOClip - rob mayoff
改用CGContextEOClip进行修复。 - Larry OBrien

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框架才能使其工作。

当你改变内圆的半径时,你可以简单地将一个新路径分配给形状层。这甚至可以被动画化。


非常感谢,omz!这个很好用。我的几何知识有点生疏(非常生疏),所以这对我帮助很大。Peter - Peter London

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接