如何在 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() 不为特定约束更改设置动画?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 3.0 中编写此代码,特别是如何在 swift3 中使用宏?
如何在 kotlin native 中使用 swift 库?