【问题标题】:An easy way to draw a circle using CAShapeLayer使用 CAShapeLayer 绘制圆的简单方法
【发布时间】:2024-10-04 10:55:01
【问题描述】:

How to draw a smooth circle......Draw Circle......draw filled Circles 等问题中,问题和答案非常广泛,包含许多不必要的步骤,并且使用的方法并不总是最容易重新创建或管理。

有什么简单的方法可以画一个圆圈并将其添加到我的UIView

【问题讨论】:

    标签: ios objective-c swift uibezierpath cashapelayer


    【解决方案1】:

    使用 CAShapeLayer 类使绘图变得容易... 1.创建 CAShapeLayer 对象 2.创建圆形路径 3.将路径设置为想要的CAShapeLayer路径 4.将图层添加到您的视图中

      let shapeLayer = CAShapeLayer()
      let center = view.center
      let circulPath = UIBezierPath(arcCenter: center, radius: 100, startAngle: 0, endAngle: 2.0 * CGFloat.pi, clockwise: true)
    
      shapeLayer.path = circulPath.cgPath 
      view.layer.addSublayer(shapeLayer)
    

    注意,这里我从视图的中心画圆。 您还可以为您的圈子设置填充颜色,如下所示:

      shapeLayer.fillColor = UIColor.red.cgColor
    

    如需进一步学习,您可以查看 CALayer.com

    【讨论】:

      【解决方案2】:

      绘制圆的一种简单方法是创建一个CAShapeLayer 并添加一个UIBezierPath

      CAShapeLayer *circleLayer = [CAShapeLayer layer];
      [circleLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 100, 100)] CGPath]];
      

      let circleLayer = CAShapeLayer();
      circleLayer.path = UIBezierPath(ovalIn: CGRect(x: 50, y: 50, width: 100, height: 100)).cgPath;
      

      创建CAShapeLayer 后,我们将其path 设置为UIBezierPath

      我们的UIBezierPath 然后绘制bezierPathWithOvalInRect。我们设置的CGRect 会影响它的大小和位置。

      现在我们有了自己的圈子,我们可以将其添加到我们的UIView 中作为sublayer

      [[self.view layer] addSublayer:circleLayer];
      

      view.layer.addSublayer(circleLayer)
      

      我们的圈子现在在我们的UIView 中可见。

      如果我们希望自定义圈子的颜色属性,我们可以通过设置CAShapeLayerstroke- 和fill 颜色轻松实现。

      [circleLayer setStrokeColor:[[UIColor redColor] CGColor]];
      [circleLayer setFillColor:[[UIColor clearColor] CGColor]];
      

      shapeLayer.strokeColor = UIColor.red.cgColor;
      shapeLayer.fillColor = UIColor.clear.cgColor;
      

      更多属性可以在关于主题https://developer.apple.com/.../CAShapeLayer_class/index.html的文档中找到。

      【讨论】:

      • 如何增加上述红色边框/笔画的大小?
      • @RohanSanap 你可以通过编辑图层的 lineWidth 属性来做到这一点