布局约束和NSAnimationContext

时间:2018-03-19 17:27:47

标签: swift macos nslayoutconstraint nsanimationcontext

我想扩展一个视图,以响应对显示三角形的点击,但动画并没有以我想要的方式运行。

enter image description here

(抱歉,如果gif没有循环播放。该工具应该创建一个循环动画,但显然没有...)

当它展开时,外部视图会立即改变大小,然后内容会向上动画回原位。当它崩溃时,尺寸再次变化,然后内容在其中滚动。我想要的是对大小更改进行动画处理,显示/隐藏内容,而不会让它们相对于封闭视图的左上角移动。

我的代码如下所示:

  NSAnimationContext.runAnimationGroup({
    context in
    context.duration = 0.25
    context.allowsImplicitAnimation = true
    // Order is important so we don't get conflicting constraints
    if newValue {
      closedConstraint.isActive = false
      openConstraint.isActive = true
    }
    else {
      openConstraint.isActive = false
      closedConstraint.isActive = true
    }
    layoutSubtreeIfNeeded()
  }, completionHandler: {
    self.disclosureButton.integerValue = newValue ? 1 : 0
  })

openConstraint将封闭视图的底部限制在最后一个字段的底部。 closedConstraint将其限制在顶部文本标签的底部,因此只有标签可见。

那么我该如何a)为封闭视图的边界设置动画,以及b)在动画过程中将内容固定在顶部?

1 个答案:

答案 0 :(得分:0)

我认为你的问题来自这样一个事实:当动画布局约束时,动画只会应用于当前视图的重新布局。

这意味着,当视图的内容重新布置动画时,框架没有动画,因此会立即重新绘制。

解决此问题的方法是尝试设置superview的动画。我不确定这在代码中是如何工作的,但可能会尝试在动画块中添加superview?.setNeedsLayout()superview?.layoutIfNeeded()

我很抱歉,如果这不是一个完美的解决方案,因为我过去遇到过类似的问题,也没有找到一个好的解决方案。

如果有帮助,请告诉我。