带有布局约束和 NSAnimationContext 的动画不正确

Posted

技术标签:

【中文标题】带有布局约束和 NSAnimationContext 的动画不正确【英文标题】:Incorrect animation with layout constraints and NSAnimationContext 【发布时间】:2018-03-19 17:27:46 【问题描述】:

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

(对不起,如果 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】:

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

这意味着,当视图的 content 使用动画重新布局时,frame 没有动画,因此会立即重新绘制。

要解决此问题,您可以尝试为 superview 设置动画。我不确定这将如何在此代码中工作,但可以尝试在动画块中添加 superview?.setNeedsLayout()superview?.layoutIfNeeded()

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

如果有帮助,请告诉我。

【讨论】:

不。我尝试了superview?.needsLayout = truesuperview?.layoutSubtreeIfNeeded() 而不是现有的调用,得到了相同的结果。

以上是关于带有布局约束和 NSAnimationContext 的动画不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何解决这个带有约束的自动布局“难题”?

带有 ScrollView 的 Android Studio 约束布局

带有约束的滚动视图自动布局问题 xcode 8

使用带有自动布局的推送时隐藏按钮时,约束更新导致项目移动

我的带有自动布局约束的 Swift 4 UIScrollView 没有滚动

Xcode 6.3 故事板自动布局约束