Ограничения борются друг с другом при прерывании анимации UIViewPropertyAnimator
Я пытаюсь реализовать прерывистую / очищаемую анимацию для представления, которое скользит вверх от нижней части экрана, почти так же, как это видео WWDC 2017 года. Мой UIViewPropertyAnimator привязан к распознавателю жестов, где жест панорамирования создает и немедленно приостанавливает аниматор, если он еще не существует, а свойство actionComplete связано с переводом пролистывания.
Все хорошо, пока я не попытаюсь прервать анимацию. Когда пауза, по какой-то причине полученное мной линейное значение FractionComplete, как правило (но не всегда), неверно (свойство аниматора scrubsLinearly имеет значение true, что означает, что FractionComplete автоматически преобразуется в линейный прогресс при приостановке).
Это означает, что когда я ловлю вид в середине полета и пытаюсь панорамировать его назад, он скачет хаотично, так как значение fractionComplete возвращается к "неправильному" значению, которое я только что прочитал + перевод. Например, когда линейное отображение проекции составляет ~50%, я обычно получаю значение FractionComplete около ~0,1 после приостановки анимации, а не ожидаемое ~0,5.
Я ограничил это (я думаю) чем-то связанным с ограничением, поскольку удаление одного из моих взглядов решает проблему.
Моя иерархия представлений выглядит следующим образом:
Основной вид контейнера прикреплен к левому, правому и нижнему краям и имеет ограничение по высоте. Ограничение высоты - это то, что я изменяю непосредственно перед запуском анимации, когда блок анимации состоит из вызова view.layoutIfNeeded().
Ручка - это просто визуальное украшение. Он закреплен слева, справа и сверху контейнера и имеет фиксированную высоту.
Вид заголовка закреплен слева и справа от суперпредставления и нижней части ручки. Существуют вертикальные ограничения между двумя рядами меток, а также верхней / нижней частью заголовка, что дает однозначную высоту представления заголовка. Я выделил верхнюю метку, чтобы попытаться показать, что я имею в виду - эта метка и метки под ней инкапсулированы в представлении заголовка.
Стол просто прикреплен к оставшемуся месту.
Если я удаляю табличное представление, все в основном работает нормально, хотя есть некоторая слегка ошибочная ситуация, когда преобразование из изогнутой в линейную прогрессию в pauseAnimation() будет привязано к 0,25-0,875 с фиксированными приращениями 0,125 (большую часть времени - я могу Выясните, что именно вызывает это). Но независимо от того, что я пытаюсь сделать, я не могу заставить его вести себя правильно при наличии табличного представления.
Я попытался дать представлению таблицы более низкий приоритет объятий и сопротивления сжатию, придать таблице фиксированную высоту, а заголовку - фиксированную высоту. Я также попытался добавить вызовы layoutIfNeeded () к каждой перестановке представлений в иерархии к анимации, но все безуспешно.
Любое понимание будет с благодарностью.