Завершение UIViewPropertyAnimator вызывается при приостановке - PullRequest
0 голосов
/ 17 января 2019

Я не очень много использовал 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 ]

0 голосов
/ 17 января 2019

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

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

import PlaygroundSupport
import UIKit

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

// etc.
0 голосов
/ 17 января 2019

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

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

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

...