Я рисую круг с помощью 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)
}
}
Этот вопрос был помечен как повторяющийся, однако вопрос совершенно другой, и предоставленный ответ рисует половину круга, а не полный круг. Значение конечного угла совершенно другое
2 * -CGFloat.pi
или0
, возможно, вы перерисовываете круг, поэтому конец штриха может выглядеть не так, как предполагалось. - person Nathan   schedule 18.07.2019self.startAngle = -CGFloat.pi / 2 self.endAngle = 1.5 * CGFloat.pi
- person froggomad   schedule 18.07.2019