за 2018 год ...
Swift 4.
использовать .setCompletionBlock
На практике вам нужно [weak self]
, или вы, как правило, вылетаете.
func animeExample() {
CATransaction.begin()
let a = CABasicAnimation(keyPath: "fillColor")
a.fromValue, duration = ... etc etc
CATransaction.setCompletionBlock{ [weak self] in
self?.animeExample()
}
someLayer.add(a, forKey: nil)
CATransaction.commit()
}
В этом примере он просто снова вызывает себя.
Конечно, вы можете вызывать любую функцию.
Примечание: если вы только начинаете. Стоит помнить, что
«ключ» (как в add#forKey
) не имеет значения и используется редко. Установите это в ноль. Если по какой-либо причине вы хотите установить его, установите для него «любую строку» (скажем, ваш никнейм). С другой стороны ...
keyPath
в вызове CABasicAnimation
на самом деле является фактической «вещью, которую вы анимируете», другими словами, это буквально свойство слоя (но просто записанное в виде строки).
Короче говоря add#forKey
почти всегда просто ноль, это не имеет значения. Он полностью, совершенно не связан с «keyPath» - тот факт, что оба они имеют «ключ» в названии, является чистым совпадением, эти две вещи совершенно не связаны.
Вы часто видите код, в котором эти два понятия перепутаны (благодаря глупому именованию), что вызывает всевозможные проблемы.
Обратите внимание, что в последнее время вы можете использовать animationDidStop
с делегатом, см. Ответ по @jack ниже! В некоторых случаях это проще; иногда проще просто использовать блок завершения. Если у вас много разных аниме (что часто бывает), просто используйте блоки завершения.