Нарисуйте изображение в области между двумя концентрическими кругами в Xcode/objective-c

У меня есть изображение (на самом деле оно круглое), и я хочу нарисовать только ту часть этого изображения, которая соответствует области между двумя концентрическими кругами, внешний фиксированный, внутренний может регулироваться по размеру.

Внешний концентрический круг всегда будет соответствовать внешнему краю изображения, но в нарисованном изображении необходимо оставить «отверстие», соответствующее размеру меньшего концентрического круга.

Я пытаюсь сделать это в Objective-C для iOS - нарисовать элемент управления "видоискатель" переменного размера.

Любая помощь высоко ценится.


person Peter London    schedule 11.02.2012    source источник
comment
FWIW, термин для круглого диска с вырезанным внутренним круговым диском, представляет собой кольцо.   -  person Benjohn    schedule 19.12.2015


Ответы (2)


Звучит как стандартный случай использования CGContextEOClip. Не проверял этот код, но что-то вроде:

CGContextRef ctxt = UIGraphicsGetCurrentContext();
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, outerCircle);
CGPathAddEllipseInRect(path, NULL, innerCircle);
CGContextEOClip(ctxt);
//Draw your stuff
person Larry OBrien    schedule 11.02.2012
comment
Вам нужно будет использовать CGContextEOClip. - person rob mayoff; 12.02.2012
comment
Исправлено использование CGContextEOClip - person Larry OBrien; 12.02.2012

Самым простым и эффективным решением, вероятно, будет использование 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, чтобы это работало.

Когда вы изменяете радиус внутреннего круга, вы можете просто назначить новый путь к слою формы. Это даже можно анимировать.

person omz    schedule 11.02.2012
comment
Большое спасибо, омз! Это сработало отлично. Я немного заржавел (очень заржавел) в своей геометрии, так что это было БОЛЬШОЙ помощью. Питер - person Peter London; 12.02.2012