【问题标题】:Animate subview AutoLayout constraint changes动画子视图 AutoLayout 约束更改
【发布时间】:2019-02-21 10:50:21
【问题描述】:

许多关于动画自动布局约束的教程建议更新约束的常量属性,然后在动画块中调用layoutIfNeeded()

我的情况有点棘手。 我有一个包含 3 个子视图的视图。这个超级视图的高度不是固定的——它被计算为其子视图的高度之和。 在某些情况下,我要求这 3 个子视图之一切换它的高度(它在 0 到 30 之间变化,即我想平滑地隐藏和显示它)。 代码类似这样:

// In superview
subview1.isVisibleInContext = !subview1.isVisibleInContext

// In subview
class MySubview: UIView {
    @IBOutlet var heightConstraint: NSLayoutConstraint!

    var isVisibleInContext = false {
        didSet {
            updateHeight()
        }
    }

    func toggleHeight() {
        let newHeight = isVisibleInContext ? 30 : 0
        layoutIfNeeded()
        heightConstraint.constant = newHeight
        UIView.animate(withDuration: 0.8) {
            self.layoutIfNeeded()
        }
    }
}

不幸的是,这并没有像我预期的那样工作。 我可以看到我的子视图高度的平滑变化,但是在我为我的子视图高度约束设置新值后,我的父视图的高度会立即重新计算。

我希望看到超级视图的高度随着其子视图的增加或减少而逐渐增加/减少。

请有人指出我正确的方向。任何帮助表示赞赏。

非常感谢!

【问题讨论】:

    标签: ios autolayout nslayoutconstraint uiviewanimation ios-autolayout


    【解决方案1】:

    动画块应该在包含 3 个MySubviewsUIView 中。在 MySubview 类中,您只需更新高度约束的常量:

    在子视图中

    func toggleHeight() {
       let newHeight = isVisibleInContext ? 30 : 0
       heightConstraint.constant = newHeight
    }
    

    然后在包含 3 个MySubviewsUIView 中为更改设置动画:

    在Superview中

    func toggleHeight(with subview: MySubview) {
       subview.toggleHeight()
       UIView.animate(withDuration: 0.8) {
          self.view.layoutIfNeeded()
       }
    }
    

    【讨论】:

    • 非常感谢您抽出宝贵时间给出如此详细的回复。欣赏!
    【解决方案2】:

    在我的方法中不正确的第一件事是执行self.layoutIfNeeded()。在调查了这个问题后,我了解到我必须在 superivew 上执行它,如下所示:

    self.superview?.layoutIfNeeded()
    

    那也没有成功是有原因的。在这种情况下,主要问题是内部有 3 个子视图的视图本身就是视图的子视图。所以为了让它工作,我不得不使用以下代码:

    self.superview?.superview?.layoutIfNeeded()
    

    子视图必须知道视图的层次结构肯定不好,但是它可以工作。

    【讨论】:

      猜你喜欢
      • 2013-12-04
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多