Анимация подпредставлений UIStackView вызывает проблемы с макетом - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть UIStackView с несколькими упорядоченными видами внутри, которые можно показывать и скрывать с помощью кнопок. Я оживляю изменения: - первоначально устанавливая альфа в 0 и isHidden = true для некоторых подпредставлений - в блоке анимации, переключение которого подпредставление имеет альфа = 1 и isHidden = false

Я создал игровую площадку, чтобы показать Проблема: https://gist.github.com/krummler/d0e8db8cb037ae7202f7d801d3114111

Короче говоря, это прекрасно работает для двух представлений: переключение между ЛЮБЫМИ двумя подпредставлениями работает нормально. При нажатии на третью вид рушится и отказывается возвращаться. После этого показ подпредставлений становится беспорядком. Интересно, что не показывает это поведение, когда анимация закомментирована.

Мои вопросы: - Я что-то упустил или я обнаружил какую-то ошибку в UIKit? - Как я могу обойти это или есть лучший способ достичь того, что я пытаюсь сделать?

1 Ответ

1 голос
/ 06 февраля 2020

Трудно сказать, как реализован UIStackView, но он может пытаться обновить свой макет при изменении isHidden, даже если значение на самом деле не меняется.

Возможно, это ошибка UIKit, но в качестве обходного пути вы можете изменить реализацию resetSubviews(to:) так, чтобы она устанавливала isHidden только когда состояние действительно меняется.

    private func resetSubviews(to view: UIView) {
        view1.alpha = view == view1 ? 1 : 0
        view2.alpha = view == view2 ? 1 : 0
        view3.alpha = view == view3 ? 1 : 0
        view4.alpha = view == view4 ? 1 : 0

        let updateIsHiddenForView = { (viewToUpdate: UIView) in
            let isHidden = view != viewToUpdate
            if isHidden != viewToUpdate.isHidden {
                viewToUpdate.isHidden = isHidden
            }
        }
        updateIsHiddenForView(view1)
        updateIsHiddenForView(view2)
        updateIsHiddenForView(view3)
        updateIsHiddenForView(view4)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...