使用CALayer作为UIImageView

时间:2011-11-29 16:23:40

标签: iphone xcode uiimageview calayer bezier

我想创建一个圆形的CALayer贝塞尔曲线路径。我想把它设置为UIImageView(能够用动画等移动它)是否可能?如果是这样我该怎么办?谢谢。

2 个答案:

答案 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路径”是什么意思,但你有几个选择:

  1. 创建UIView的子类,使用UIBezierPath中的drawRect:方法绘制圆圈。然后可以将此视图作为子视图添加到另一个视图,并使用标准方法进行动画处理。但是,您会收到警告,这可能会影响性能(因为它必须继续重新绘制),所以如果这确实是一个问题......
  2. 创建图形上下文并在那里绘制圆圈。从此图形上下文中获取图像,并将其设置为UIImageView的图像。动画,如答案(1)。这样你就不会一直重绘,所以性能会更好,但首先尝试使用选项1,因为它更简单,如果你有简单的绘图代码,它不会对你产生太大的影响。
  3. 对于选项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];