Swift - Как получить закругленный колпачок на CAShapeLayer или UIBezierPath(ovalInRect: ovalRect)

У меня есть эти 2 функции ниже в моем классе, который расширяет 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);
  }

1 ответ

Если это слой формы, вы просто говорите myShapeLayer.lineCap = "round", (Я озадачен вашей маской и кодом рисования, который не имеет ничего общего со слоем формы, поэтому я не понимаю, как он должен вписываться.)

Это слой формы с круговой траекторией:

Версия Swift 4:

myShapeLayer.lineCap = .round

Документацию по значениям ограничения строки можно найти здесь

Другие вопросы по тегам