gpt4 book ai didi

ios - 调用 setNeedsLayout 或 setNeedDisplay 的时机

转载 作者:可可西里 更新时间:2023-11-01 00:55:21 27 4
gpt4 key购买 nike

我已经阅读了一些关于 setNeedsLayout 和 layoutIfNeeded 之间的区别的文章,而我关注的是:

<强>1。如果我想要立即布局,我是否需要同时调用这两个方法,因为我已经多次看到这种组合

<强>2。我什么时候需要调用 setNeedsLayout?据我了解,如果我更改 View 的框架,它将在下一个周期更新布局,我不必显式调用 setNeedsLayout

最佳答案

这些东西的工作原理是通过失效来消除冗余。 View 将包含是否需要布局的信息。

因此调用 setNeedsLayout 只会将一些内部 bool 值 needsLayout 设置为 true。一旦 layoutIfNeeded 被调用,它将检查这个 bool 值

if needsLayout { 
needsLayout = false
doMagic() // Calls layoutSubviews at some point
}

为什么这样设计是因为多次调用可能会使布局无效,但我们希望只布局一次或尽可能少地布局。

在大多数情况下,您不需要调用 setNeedsLayout,因为大多数更改已经为您完成了。例如,您可以更改约束值并为您完成失效。您只需调用 layoutIfNeeded,您的 View 就会更新。更准确地说,您甚至不需要调用 layoutIfNeeded,因为它会在下一个周期为您完成。但是,如果您想要更改动画,则需要调用它,并且您需要在动画 block 中执行此操作。

myViewConstraint.constant = 40.0 // Will already call setNeedsLayout
UIView.animate(withDuration: 0.3, animations: {
myView.layoutIfNeeded()
})

因此,更改约束只会更改有关 View 应如何布局的信息。只有对 layoutIfNeeded 的调用才会实际使用这些值并更改布局。这就是为什么你只需要将它放在动画 block 中(尽管将它全部放在 block 中并没有错)。

公平地说,有一些变化,现在默认情况下(您可以禁用它)动画方法已经自行布局您的 View ,因此您可以使用更少的代码来完成,但这不是目前的重点。

所以:

  1. 您不需要同时调用这两个方法来立即布局。如果 View 布局已经失效(在大多数情况下是这样),那么 layoutIfNeeded 就足够了。但请注意,setNeedsLayout 与在内部将 bool 值设置为 true 一样微不足道,因此调用它没有任何坏处,只是一种预防措施。所以两者都调用更安全。不过,单独调用 setNeedsLayout 不会“立即”执行任何操作。

  2. 希望您永远不需要调用 setNeedsLayout。在某些复杂的情况下,您需要明确使布局无效,并且可能存在一些 UI 错误。在所有其他情况下,这将为您完成。但是请注意,如果您遇到需要调用此“它将在下一个周期更新布局”的情况,那将是不正确的。在 View 布局无效之前,它根本不会布局。

我不确定 setNeedDisplay 在哪里适合您的问题(它只在您的标题中),但这个的工作方式相同,但有点复杂。它会使其内容无效并强制重绘,调用drawRect。这必须在其绘图管道期间发生,而不仅仅是任何时候,因此您可能不会显式调用它来重绘。如果你什么都不做(可能会崩溃),因为它没有上下文可以借鉴。如果您覆盖 drawRect 并调整 View 大小,它将尝试缓存您绘制的内容并使用 contentMode 调整绘图大小。默认情况下,它设置为 scaleToFill,这意味着您的内容将随着 View 大小的变化而拉伸(stretch)。您需要调用 setNeedDisplay 才能再次调用您的 drawRect,并且您可以相应地重绘内容。

关于ios - 调用 setNeedsLayout 或 setNeedDisplay 的时机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50406332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com