0

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

在此处输入图像描述

(对不起,如果 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) 在动画期间将内容固定在顶部?

4

1 回答 1

0

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

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

要解决此问题,您可以做的是尝试制作动画superview。我不确定这在这段代码中是如何工作的,但也许可以尝试在你的动画块中添加superview?.setNeedsLayout()和 。superview?.layoutIfNeeded()

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

让我知道这是否有帮助。

于 2018-03-19T19:40:04.450 回答