【问题标题】:Animating UIStackView subviews causes layout issues动画 UIStackView 子视图会导致布局问题
【发布时间】:2020-02-05 21:10:29
【问题描述】:

我有一个 UIStackView,里面有几个排列好的视图,可以使用按钮显示和隐藏。 我通过以下方式为更改设置动画: - 最初将某些子视图的 alpha 设置为 0 和 isHidden = true - 在动画块中,切换哪个子视图具有 alpha = 1 和 isHidden = false

我创建了一个游乐场来展示这个问题:https://gist.github.com/krummler/d0e8db8cb037ae7202f7d801d3114111

简而言之,这适用于两个视图:在任意两个子视图之间切换都可以正常工作。当按下第三个时,视图会崩溃并拒绝返回。之后,显示子视图变得一团糟。有趣的是,当动画被注释掉时,它确实显示这种行为。

我的问题: - 我错过了什么还是我在 UIKit 中遇到了一些错误? - 我该如何解决这个问题,或者是否有更好的方法来实现我想要做的事情?

【问题讨论】:

  • 能否在问题中包含一个代码 sn-p?
  • @GabeSpound 示例代码挺大的,就是网址里的游乐场

标签: ios swift xcode uikit uistackview


【解决方案1】:

很难说 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)
    }

【讨论】:

  • 谢谢,有趣的是,当我注释掉动画时,这种行为不会出现。不管怎样,这有助于避免这个问题,谢谢!
猜你喜欢
  • 2015-02-04
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
相关资源
最近更新 更多