Добавьте callback
, чтобы знать, когда закончится анимация. И используйте CATransaction
, чтобы узнать, когда анимация завершена.
var animationCompletedCallback: (() -> Void)?
func setProgressWithAnimation(duration: TimeInterval, value: Float) {
CATransaction.setCompletionBlock {
if let callBack = animationCompletedCallback {
callBack()
}
}
CATransaction.begin()
let animation = CABasicAnimation (keyPath: "strokeEnd")
animation.duration = duration
animation.fromValue = 0
animation.toValue = value
animation.repeatCount = .infinity
animation.timingFunction = CAMediaTimingFunction (name: kCAMediaTimingFunctionLinear)
progressLayer.strokeEnd = CGFloat(value)
progressLayer.add(animation, forKey: "animateprogress")
CATransaction.commit()
}
И добавить эту функцию после addLongPressGesture()
в viewDidLoad()
:
private func addCounterViewCallback() {
counterView.animationCompletedCallback = { [weak self] in
guard let weakSelf = self else {return}
weakSelf.addFlashView()
}
}
Чтобы удалить слой используйте это:
func removeLayers() {
shapeLayer.removeAllAnimations()
shapeLayer.removeFromSuperlayer()
progressLayer.removeAllAnimations()
progressLayer.removeFromSuperlayer()
}
Обновление 1:
Чтобы удалить анимацию, если пользователь перестает нажимать, вам нужно добавить переменную в обратный вызов, например:
var animationCompletedCallback: ((isAnimationCompleted: Bool) -> Void)?
Так что теперь обратный вызов в CounterView
будет:
if let callBack = animationCompletedCallback { callBack(true) }
В вашем контроллере добавьте одну переменную:
var isAnimationCompleted = false
Изменить addCounterViewCallback()
:
private func addCounterViewCallback() {
counterView.animationCompletedCallback = { [weak self] (isCompleted) in
guard let weakSelf = self else {return}
weakSelf.isAnimationCompleted = isCompleted
weakSelf.addFlashView()
}
}
Теперь вы можете добавить одно условие в longPress ():
if gesture.state == UIGestureRecognizerState.ended {
if !isAnimationCompleted {
//Call remove layers code
}
}
Обновление 2:
Добавить переменную в CounterView
:
var isAnimationCompleted = true
Изменить обратный вызов, как это:
CATransaction.setCompletionBlock {
if let callBack = self.animationCompletedCallback { callBack(isAnimationCompleted) }
}
В контроллере longPress()
:
if gesture.state == UIGestureRecognizerState.ended {
if !isAnimationCompleted {
self.counterView.isAnimationCompleted = false
self.counterView.removeLayers()
}
}
Изменить addCounterViewCallback()
на это:
private func addCounterViewCallback() {
counterView.animationCompletedCallback = { [weak self] (isCompleted) in
guard let weakSelf = self else {return}
weakSelf.isAnimationCompleted = isCompleted
if isCompleted {
weakSelf.addFlashView()
}
}
}