Неожиданный StrokeEnd для CAShapeLayer

Я рисую круг с помощью CAShapeLayer, и по какой-то причине штрих будет рисоваться только с интервалом 25%. Например, если задать для StrokeEnd значение 0,4, обводка будет занимать 50% круга.

Как я могу нарисовать штрих CAShapeLayer в предполагаемой позиции?

import UIKit

class DrawCircle {
    let shapeLayer = CAShapeLayer()
    let trackLayer = CAShapeLayer()
    let center: CGPoint
    let radius: CGFloat
    let startAngle: CGFloat
    let endAngle: CGFloat
    let clockwise: Bool

    let fillColor: CGColor
    let strokeColor: CGColor
    let lineWidth: CGFloat
    var strokeEnd: CGFloat
    let view: UIView
    let circularPath: UIBezierPath
    let withTrack: Bool
    private var trackColor: CGColor

    init(withTrack: Bool, trackColor: CGColor, radius: CGFloat, center: CGPoint, clockwise: Bool, fillColor: CGColor, strokeColor: CGColor, lineWidth: CGFloat, view: UIView) {
        //path params
        self.center = center
        self.radius = radius
        self.startAngle = -CGFloat.pi / 2
        self.endAngle = 2 * CGFloat.pi
        self.clockwise = clockwise
        self.circularPath = UIBezierPath(arcCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: clockwise)
        //shape params
        self.fillColor = fillColor
        self.strokeColor = strokeColor
        self.strokeEnd = 0.4
        self.lineWidth = lineWidth

        //view to attach to
        self.view = view
        self.withTrack = withTrack
        if withTrack {
            self.trackColor = trackColor
        } else {
            self.trackColor = UIColor.clear.cgColor
        }
    }

    func draw() {
        if withTrack {
            drawTrack()
            print("track drawn: \(self.trackLayer)")
        }
        shapeLayer.path = circularPath.cgPath
        shapeLayer.strokeColor = strokeColor
        shapeLayer.fillColor = fillColor
        shapeLayer.lineWidth = self.lineWidth
        shapeLayer.strokeEnd = self.strokeEnd
        shapeLayer.lineCap = .round
        view.layer.addSublayer(shapeLayer)
    }

    func drawTrack() {
        trackLayer.path = circularPath.cgPath
        trackLayer.strokeColor = trackColor
        trackLayer.fillColor = UIColor.clear.cgColor
        trackLayer.lineWidth = self.lineWidth
        trackLayer.lineCap = .round
        view.layer.addSublayer(trackLayer)
    }

}

Этот вопрос был помечен как повторяющийся, однако вопрос совершенно другой, и предоставленный ответ рисует половину круга, а не полный круг. Значение конечного угла совершенно другое


person froggomad    schedule 18.07.2019    source источник
comment
Попробуйте изменить начальный угол на 2 * -CGFloat.pi или 0, возможно, вы перерисовываете круг, поэтому конец штриха может выглядеть не так, как предполагалось.   -  person Nathan    schedule 18.07.2019
comment
Спасибо, это проблема. Но как я могу начать круг сверху, а не справа?   -  person froggomad    schedule 18.07.2019
comment
Исправлено, если вы хотите добавить ответ self.startAngle = -CGFloat.pi / 2 self.endAngle = 1.5 * CGFloat.pi   -  person froggomad    schedule 18.07.2019
comment
рад, что это сработало!   -  person Nathan    schedule 18.07.2019


Ответы (1)


Измените начальный и конечный углы на:

self.startAngle = -CGFloat.pi / 2 
self.endAngle = 1.5 * CGFloat.pi
person Nathan    schedule 18.07.2019
comment
На самом деле это рисование половины круга, и изменение конечного угла на CGFloat.pi * 2 снова приводит к перерисовке. Пожалуйста, смотрите мой комментарий к вопросу о правильных значениях - person froggomad; 19.07.2019
comment
@froggomad исправил, спасибо - person Nathan; 19.07.2019