использовать CALayer в качестве UIImageView - PullRequest
1 голос
/ 29 ноября 2011

Я бы хотел создать путь Безье CALayer в форме круга. И я хотел бы установить его как UIImageView (чтобы иметь возможность перемещать его с помощью анимации и т. Д.) Возможно ли это? Если так, как я могу это сделать? Спасибо.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Вы всегда можете добавить CAShapeLayer к вашему виду.Во время init выполните что-то вроде (все не проверено):

CAShapeLayer *circle = [[CAShapeLayer alloc] init];
[self.layer addSublayer:circle];

Затем в drawRect, layoutSubViews или в другом месте, которое кажется подходящим для обновления макета:

circle.fillColor = [[UIColor redColor].CGColor;
CGMutablePathRef p = CGPathCreateMutable();
CGPathAddEllipseInRect(p, NULL, self.bounds);
circle.path = p;
circle.bounds = self.bounds;
circle.position = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
1 голос
/ 29 ноября 2011

Я не уверен, что вы подразумеваете под "CALayer безье", но у вас есть несколько вариантов здесь:

  1. Создайте подкласс UIView, где вы рисуете свой круг, используя UIBezierPath методы в drawRect:. Это представление затем может быть добавлено в другое представление как подпредставление и анимировано с использованием стандартных методов. Тем не менее, вас предупреждают, что это может повлиять на производительность (поскольку она должна постоянно перерисовываться), так что, если это окажется проблемой ...
  2. Создайте графический контекст и нарисуйте там свой круг. Возьмите изображение из этого графического контекста и установите его в качестве изображения для UIImageView. Анимируйте как в ответе (1). Таким образом, вы не будете перерисовывать все время, чтобы производительность была лучше, но сначала попробуйте вариант 1, поскольку он проще, и если у вас есть простой код для рисования, это не должно сильно на вас повлиять.

Для варианта 2 вы начинаете графический контекст, используя UIGraphicsBeginImageContextWithOptions - затем вы рисуете и извлекаете изображение, используя UIGraphicsGetImageFromCurrentImageContext, затем заканчиваете контекст, используя UIGraphicsEndImageContext. Все эти функции документированы здесь

Пример кода для этого:

CGFloat radius = 50;
CGSize size = CGSizeMake(radius*2,radius*2);
CGPoint centre = CGPointMake(radius,radius);

UIGraphicsBeginImageContextWithOptions(size,NO, 0.0);
UIBezierPath * solidPath = [UIBezierPath bezierPathWithArcCenter:centre radius:edgeSize/20 startAngle:0 endAngle:2 * M_PI clockwise:YES];
[solidPath closePath];
[[UIColor whiteColor] set];
[solidPath fill];

UIImage *circle = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imageView = [[UIImageView alloc] initWithImage:circle];
...