如何在 Swift 中使用 layoutIfNeeded() 不为特定约束更改设置动画?

Posted

技术标签:

【中文标题】如何在 Swift 中使用 layoutIfNeeded() 不为特定约束更改设置动画?【英文标题】:How to not animate specific constraint changes with layoutIfNeeded() in Swift? 【发布时间】:2017-03-13 15:56:28 【问题描述】:

我有一个包含子视图的 UIView。子视图通过约束更改和 layoutIfNeeded() 函数进行动画处理:

for i in 1...cardViews.count - 1 
    let currentCard = cardViews[i]
    let previousCard = cardViews[i-1]

    // Set new offset
    currentCard.topConstraint?.constant = previousCard.contentView.frame.height + configuration.expandedOffset


// To animate constraints's changes
UIView.animate(withDuration: TimeInterval(duration), delay: 0, options: [.curveEaseOut], animations: 
    self.layoutIfNeeded()
, completion: nil)

但是当我这样做时,它也会动画父母的约束变化。像这样:

self.Height == containerView.Height

如何调用 layoutIfNeeded() 来为我的子视图而不是父视图设置动画?

编辑:副作用: http://gph.is/2noI3w9

【问题讨论】:

尝试在动画块中布局self 之前立即手动调用parent.layoutIfNeeded。这将强制父级在 self 用动画布局之前布局没有动画 当我执行parent.layoutIfNeeded() 时,它会为其所有子视图设置动画 如果在更新约束之前调用呢? 不起作用... :(我认为这是因为我不想动画的约束是动态的并且取决于子视图约束 如果父项的约束依赖于子项的约束,为什么不希望他们一起动画呢?在我看来,如果一个动画而另一个没有动画,效果会很刺耳。 【参考方案1】:

你可以在你的 UIView.animate 中调用它

for i in 1...cardViews.count - 1 
    let currentCard = cardViews[i]
    currentCard.layoutIfNeeded()

代替

self.layoutIfNeeded()

【讨论】:

您是否在 UIView.animate 中添加了 layoutIfNeeded() ? @威尔 @Will 如果这不是您要找的答案,请解释一下“这会破坏动画”的含义 当我说“Broke”时,这意味着它不是动画的。我在我的问题中添加了一个 gif,以便更明确 让我们continue this discussion in chat。

以上是关于如何在 Swift 中使用 layoutIfNeeded() 不为特定约束更改设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

如何在OC中使用Swift如何在Swift中使用OC

如何在 swift 3.0 中编写此代码,特别是如何在 swift3 中使用宏?

如何在 kotlin native 中使用 swift 库?

如何在 Swift 中使用 Apple 地图 - 你必须使用 C 还是 Swift 可以?

如何在 Swift 中使用 MKPolylineView

如何在 Swift 中使用`syslog`