Нарисуйте изображение в области между двумя концентрическими кругами в Xcode / target-c - PullRequest
3 голосов
/ 12 февраля 2012

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

Япытаясь сделать это в target-c для iOS - нарисовать элемент управления «видоискателя» переменного размера.

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

Ответы [ 2 ]

3 голосов
/ 12 февраля 2012

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

CGContextRef ctxt = UIGraphicsGetCurrentContext();
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddEllipseInRect(path, NULL, outerCircle);
CGPathAddEllipseInRect(path, NULL, innerCircle);
CGContextEOClip(ctxt);
//Draw your stuff
1 голос
/ 12 февраля 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, чтобы это работало.

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

...