Iphone 将CALayer用作UIImageView

Iphone 将CALayer用作UIImageView,iphone,xcode,uiimageview,calayer,bezier,Iphone,Xcode,Uiimageview,Calayer,Bezier,我想创建一个圆形的CALayerbezier路径。我想把它设置成一个UIImageView(能够用动画等移动它)可能吗?如果是,我怎么做?谢谢。我不知道您所说的“CALayerbezier路径”是什么意思,但您在这里有几个选项: 创建UIView的子类,使用drawRect:中的UIBezierPath方法绘制圆。然后可以将此视图作为子视图添加到另一个视图中,并使用标准方法设置动画。但是,我们警告您,这可能会影响性能(因为它必须不断地重新绘制),所以如果这确实是一个问题 创建图形上下文并在其中绘

我想创建一个圆形的
CALayer
bezier路径。我想把它设置成一个
UIImageView
(能够用动画等移动它)可能吗?如果是,我怎么做?谢谢。

我不知道您所说的“
CALayer
bezier路径”是什么意思,但您在这里有几个选项:

  • 创建UIView的子类,使用
    drawRect:
    中的
    UIBezierPath
    方法绘制圆。然后可以将此视图作为子视图添加到另一个视图中,并使用标准方法设置动画。但是,我们警告您,这可能会影响性能(因为它必须不断地重新绘制),所以如果这确实是一个问题
  • 创建图形上下文并在其中绘制圆。从该图形上下文中获取图像,并将其设置为
    UIImageView
    的图像。如答案(1)所示设置动画。这样,您就不会一直重画,所以性能会更好,但请先尝试使用选项1,因为它更简单,如果您有简单的绘图代码,它不会对您产生太大影响 对于选项2,您可以使用
    UIGraphicsBeginImageContextWithOptions
    开始图形上下文-然后进行绘图,并使用
    UIGraphicsGetImageFromCurrentImageContext
    提取图像,然后使用
    uigraphicsSendImageContext
    结束上下文。这些功能都有文档记录

    执行此操作的示例代码:

    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];
    

    您可以随时向视图中添加一个CAShapeLayer。在初始化期间,执行以下操作(所有未测试):

    然后,在drawRect、LayoutSubView或其他似乎适合更新布局的位置:

    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));
    

    不知道你的意思。你想用一个圆圈来屏蔽UIImageView吗?不,只是创建一个没有UIImageView的圆圈:)我怎么做?有代码或链接可以做到这一点吗?请看更新的答案,我现在不能给你一个完整的示例,这对你来说够了吗?不太好,但我可以等待。慢慢来,我会等待完整的答案,因为现在我不能这样做:/您还必须将图像视图作为子视图添加到屏幕上的某些内容。我认为你已经有了这个部分。它可以工作,但如果你看看这个链接和那里的示例代码,那就太好了。在这个代码中,作者修改了图层的形状。我想知道如何像你在这里做的那样将代码的图层放在uiimageView中?我认为这是一个更好的解决方案。但是不要忘记fillColor上的
    .CGColor
    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));