【问题标题】:Swift - How to get Rounded Cap on CAShapeLayer or UIBezierPath(ovalInRect: ovalRect)Swift - 如何在 CAShapeLayer 或 UIBezierPath(ovalInRect:ovalRect)上获得圆角帽
【发布时间】:2023-08-12 14:47:01
【问题描述】:

我的类中有以下两个函数,它们扩展了 CAShapeLayer,但每次绘制路径时,我都无法获得带有圆形端盖的弧线。它看起来总是这样的:

我已经尝试使用 kCALineCapRound,但没有成功。有什么想法吗?

self.lineShape.lineCap = kCALineCapRound;

self.lineShape.lineJoin = kCALineJoinRound;

  private func mask() {
    let maskLayer = CAShapeLayer()
    maskLayer.bounds = self.bounds
    let ovalRect = self.hollowRect
    let path =  UIBezierPath(ovalInRect: ovalRect)
    path.appendPath(UIBezierPath(rect: maskLayer.bounds))
    maskLayer.path = path.CGPath
    maskLayer.lineShape.lineCap = kCALineCapRound;
    maskLayer.lineShape.lineJoin = kCALineJoinRound;
    maskLayer.position = self.currentCenter
    maskLayer.fillRule = kCAFillRuleEvenOdd
    self.mask = maskLayer
  }

  private func drawTrack(ctx: CGContext) {
    let adjustDegree = Math.adjustDegree(self.setting.startAngle, degree: self.degree)
    let centerX = self.currentCenter.x
    let centerY = self.currentCenter.y
    let radius = min(centerX, centerY)
    CGContextSetFillColorWithColor(ctx, self.setting.trackingColor.CGColor)
    CGContextSetLineCap(ctx, CGLineCap.Round)
    CGContextBeginPath(ctx)
    CGContextMoveToPoint(ctx, centerX, centerY)
    CGContextAddArc(ctx, centerX, centerY, radius,
      CGFloat(Math.degreesToRadians(self.setting.startAngle)),
      CGFloat(Math.degreesToRadians(adjustDegree)), 0)
    CGContextClosePath(ctx);
    CGContextFillPath(ctx);
  }

【问题讨论】:

    标签: ios swift uibezierpath rounded-corners cashapelayer


    【解决方案1】:

    如果这是一个形状层,你只需说myShapeLayer.lineCap = "round"。 (我对你的蒙版和绘制代码感到困惑,这与形状层无关,所以我不明白它应该如何适应。)

    这是一个圆形路径的形状层:

    【讨论】:

    • 你真的不应该使用定义的常量(在这种情况下为kCALineJoinRound)而不是文字字符串“round”吗?
    • @DuncanC 我做了标题告诉我的事情。有效。我停了下来。
    • 您介意在此处发布那个红色圆圈的代码吗?
    • @MarcoCoi 您的问题是“如何在 CAShapeLayer 上获得圆形帽”。我这样回答。那是一个形状层,它画出你正在画的弧线,它有圆角,我告诉过你的代码。
    • 好吧,也许这和面具有关。
    【解决方案2】:

    Swift 4 版本:

    myShapeLayer.lineCap = .round
    

    线路上限值的文档可以在here找到

    【讨论】: