动画子视图 AutoLayout 约束更改

rea*_*dim 1 uiviewanimation ios autolayout nslayoutconstraint ios-autolayout

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

我的情况有点棘手。我有一个包含 3 个子视图的视图。这个 superview 的高度不是固定的 - 它被计算为其子视图的高度总和。在某些情况下,我要求这 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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

非常感谢!

joe*_*ern 6

动画块应该在UIView包含 3 的MySubviews. 在MySubview类中,您只更新高度约束的常量:

在子视图中

func toggleHeight() {
   let newHeight = isVisibleInContext ? 30 : 0
   heightConstraint.constant = newHeight
}
Run Code Online (Sandbox Code Playgroud)

然后在UIView包含 3MySubviews动画的更改中:

在超级视图中

func toggleHeight(with subview: MySubview) {
   subview.toggleHeight()
   UIView.animate(withDuration: 0.8) {
      self.view.layoutIfNeeded()
   }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明