Ich versuche, einen benutzerdefinierten Aktivitätsindikator vergleichbar mit dem Android-Materialentwurf kreisförmige unbestimmte Aktivität Indikator. Grundsätzlich möchte ich den Kreis zwei Mal zeichnen und löschen, aber Löschen und Zeichnen geschieht nicht zur gleichen Zeit oder Geschwindigkeit. Dies ist, was ich bisher habe:Verbinden Sie zwei strokeEnd Animationen
let progressLayer = CAShapeLayer()
progressLayer.strokeColor = UIColor.red().cgColor
progressLayer.fillColor = nil
progressLayer.lineWidth = 2
let drawAnimation = CABasicAnimation(keyPath: "strokeEnd")
drawAnimation.duration = duration/2
drawAnimation.fromValue = 0
drawAnimation.toValue = 1
drawAnimation.isRemovedOnCompletion = false
drawAnimation.fillMode = kCAFillModeForwards
let eraseAnimation = CABasicAnimation(keyPath: "strokeStart")
eraseAnimation.duration = duration/2
eraseAnimation.beginTime = 0.2
eraseAnimation.fromValue = 0
eraseAnimation.toValue = 0.4
eraseAnimation.isRemovedOnCompletion = false
eraseAnimation.fillMode = kCAFillModeForwards
let endDrawAnimation = CABasicAnimation(keyPath: "strokeEnd")
endDrawAnimation.beginTime = duration/2
endDrawAnimation.duration = duration/2
endDrawAnimation.fromValue = 0
endDrawAnimation.toValue = 1
endDrawAnimation.isRemovedOnCompletion = false
endDrawAnimation.fillMode = kCAFillModeForwards
let endEraseAnimation = CABasicAnimation(keyPath: "strokeStart")
endEraseAnimation.beginTime = duration/2
endEraseAnimation.duration = duration/4
endEraseAnimation.fromValue = 0.4
endEraseAnimation.toValue = 1
endEraseAnimation.isRemovedOnCompletion = false
endEraseAnimation.fillMode = kCAFillModeForwards
let endEraseAnimation2 = CABasicAnimation(keyPath: "strokeStart")
endEraseAnimation2.beginTime = duration * 3/4
endEraseAnimation2.duration = duration/4
endEraseAnimation2.fromValue = 0
endEraseAnimation2.toValue = 1
endEraseAnimation2.isRemovedOnCompletion = false
endEraseAnimation2.fillMode = kCAFillModeForwards
let animations = CAAnimationGroup()
animations.duration = duration
animations.animations = [drawAnimation, eraseAnimation, endDrawAnimation, endEraseAnimation, endEraseAnimation2]
animations.isRemovedOnCompletion = false
animations.fillMode = kCAFillModeForwards
progressLayer.add(animations, forKey: "stroke")
Der Code macht alles wie erwartet, mit Ausnahme eines Problems. Wenn die erste strokeEnd
Animation gemacht wird und die zweite beginnt, gibt es eine Art Flash, was bedeutet, dass der Teil des Kreises, der bis zu diesem Punkt gezeichnet wurde, verschwindet und dann wieder von 0 beginnt. Hat jemand irgendwelche Ideen, wie das zu beheben ist?
Ihr Code anzeigen Fehler, wenn ich zu kompilieren versuchen, bitte deinen Code setzen, um zu helfen Sie –
@ReinierMelian das ist Swift 3 Code, stellen Sie sicher, dass Sie Xcode 8 verwenden oder es zu Swift 2 übersetzen. @Banana, was ist 'progressLayer'? – JAL
'progressLayer' ist ein' CAShapeLayer', den ich der obigen Frage hinzugefügt habe. – Banana