Завершение UIViewPropertyAnimator вызывается при приостановке

Я не использовал UIViewPropertyAnimator очень (все еще старомодный парень из блоков), и я вижу какое-то поведение, которое не могу объяснить, и что документы на самом деле не дают никакого понимания.

Почему блок завершения аниматора вызывается с finalPosition из .end даже когда аниматор ставится на паузу сразу после его запуска?

let view = UIView()
let animator = UIViewPropertyAnimator(duration: 4, curve: .linear, animations: {
    view.alpha = 0
})

animator.addCompletion { position in
    print("done")
    switch position {
    case .start: print("start")
    case .current: print("current")
    case .end: print("end")
    }
}

animator.startAnimation()
print("starting")
animator.pauseAnimation()
print("pausing")

Выход:

starting
pausing
done
end

2 ответа

Решение

Проблема, на которую ссылается @matt, заключается в том, что ваш вид не виден UIWindow, поэтому анимация завершается немедленно. Вы получите тот же результат, если вы закомментируете animator.pauseAnimation() заявление.

Вы можете исправить это, если вы используете игровую площадку, сделав view liveView страницы детской площадки:

import PlaygroundSupport
import UIKit

let view = UIView()
PlaygroundPage.current.liveView = view

// etc.

Если вы читаете документацию addCompletion с сайта разработчика Apple, одним из параметров является finalPosition. И вы можете использовать значение, чтобы определить, остановилась ли анимация в начале, конце или где-то посередине. И вызов pauseAnimation вызовет этот блок завершения где-то в средней позиции.

Завершение параметров Блок для выполнения после завершения анимации. Этот блок не имеет возвращаемого значения и принимает следующий параметр:

finalPosition Конечная позиция анимации. Используйте это значение, чтобы определить, остановились ли анимации в начале, конце или где-то посередине.

Другие вопросы по тегам