我想创建一个圆形的CALayer
贝塞尔曲线路径。我想把它设置为UIImageView
(能够用动画等移动它)是否可能?如果是这样我该怎么办?谢谢。
答案 0 :(得分:2)
您始终可以在视图中添加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 :(得分:1)
我不确定“CALayer
bezier路径”是什么意思,但你有几个选择:
UIBezierPath
中的drawRect:
方法绘制圆圈。然后可以将此视图作为子视图添加到另一个视图,并使用标准方法进行动画处理。但是,您会收到警告,这可能会影响性能(因为它必须继续重新绘制),所以如果这确实是一个问题...... UIImageView
的图像。动画,如答案(1)。这样你就不会一直重绘,所以性能会更好,但首先尝试使用选项1,因为它更简单,如果你有简单的绘图代码,它不会对你产生太大的影响。 对于选项2,您使用UIGraphicsBeginImageContextWithOptions
开始图形上下文 - 然后执行绘图,使用UIGraphicsGetImageFromCurrentImageContext
提取图像,然后使用UIGraphicsEndImageContext
结束上下文。这些功能都记录在案here
执行此操作的示例代码:
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];