Я пытаюсь сделать пользовательский индикатор активности, подобный индикатору активности, показывающему круговую неопределенность активности Android. В принципе, я хочу нарисовать круг два раза и стереть его, но стирание и рисование не происходит одновременно или быстро. Это то, что у меня есть до сих пор:Подключитесь к анимации двухтактных анимаций
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")
Код делает все, как ожидалось, за исключением одной проблемы. Когда первая анимация strokeEnd
начинается, а вторая начинается, есть какая-то вспышка, означающая часть круга, которая была нарисована до тех пор, пока эта точка не исчезнет, а затем рисунок снова начнется с 0. Есть ли у кого-нибудь идеи, как это исправить?
Ваши показать ошибки код, когда я пытаюсь скомпилировать, пожалуйста, поместите ваш реальный код, для того, чтобы помочь вы –
@ReinierMelian это код Swift 3, убедитесь, что вы используете Xcode 8 или переводите его в Swift 2. @Banana, что такое 'progressLayer'? – JAL
'progressLayer' является' CAShapeLayer', я добавил это к вопросу выше. – Banana