- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经阅读了一些关于 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 ,因此您可以使用更少的代码来完成,但这不是目前的重点。
所以:
您不需要同时调用这两个方法来立即布局。如果 View 布局已经失效(在大多数情况下是这样),那么 layoutIfNeeded
就足够了。但请注意,setNeedsLayout
与在内部将 bool 值设置为 true 一样微不足道,因此调用它没有任何坏处,只是一种预防措施。所以两者都调用更安全。不过,单独调用 setNeedsLayout
不会“立即”执行任何操作。
希望您永远不需要调用 setNeedsLayout
。在某些复杂的情况下,您需要明确使布局无效,并且可能存在一些 UI 错误。在所有其他情况下,这将为您完成。但是请注意,如果您遇到需要调用此“它将在下一个周期更新布局”的情况,那将是不正确的。在 View 布局无效之前,它根本不会布局。
我不确定 setNeedDisplay
在哪里适合您的问题(它只在您的标题中),但这个的工作方式相同,但有点复杂。它会使其内容无效并强制重绘,调用drawRect
。这必须在其绘图管道期间发生,而不仅仅是任何时候,因此您可能不会显式调用它来重绘。如果你什么都不做(可能会崩溃),因为它没有上下文可以借鉴。如果您覆盖 drawRect
并调整 View 大小,它将尝试缓存您绘制的内容并使用 contentMode
调整绘图大小。默认情况下,它设置为 scaleToFill
,这意味着您的内容将随着 View 大小的变化而拉伸(stretch)。您需要调用 setNeedDisplay
才能再次调用您的 drawRect
,并且您可以相应地重绘内容。
关于ios - 调用 setNeedsLayout 或 setNeedDisplay 的时机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50406332/
我有一个带有单元格的 TableView ,有时它有一个可选的 UI 元素,有时它必须被删除。根据元素,标签会调整大小。 初始化单元格时,它比以后要窄。当我将数据设置到标签中时,从 cellForRo
我有一个分组格式的 UITableView,其中有几个单元格。单元格中有一个 UIView,我要向其添加另一个 UIView。当我更新第一个 UIView 的框架时,它不会改变它的位置和大小。 如果单
动画约束变化的标准方法是。 // Change constraints like: someConstraint.constant = 100 UIView.animate(withDuration:
我想知道 Apple 的 -setNeedsLayout 是如何工作的。 我已经知道它比直接调用 -layoutSubviews 更有效,因为我可能需要在一个方法中执行两次。 这正是我需要它的目的:一
UIView 方法 setNeedsLayout 和 setNeedsDisplay 之间的真正区别是什么? 像往常一样,文档对此模糊不清。 最佳答案 实际上文档对此很清楚: setNeedsLayo
一些 S.O.问题展示了一种自动布局技术,用于确定 View 满足其约束所需的最小尺寸:[header systemLayoutSizeFittingSize: UILayoutFittingComp
据我所知, -setNeedsLayout 方法仅将标志设置为 View ,以便在下一个更新周期布局 subview 。但是 layoutIfNeeded 立即调用 layoutSubviews 方法
从 OSX 10.7 开始,如果您希望执行 NSView 的手动布局,您应该通过覆盖 layout 方法来实现,并且无论何时您希望安排对该方法的调用,您只需执行以下操作: [myView setNee
在 iOS 上,是否有必要在以编程方式更改约束常量后进行任何 API 调用(例如 setNeedsLayout 或 layoutIfNeeded)?在我的用例中,我对动画变化不感兴趣。我相信存在一些错
我想在当前 ViewController 的底部显示一个 ViewController,具有特定的高度。然后我添加了将 ViewController 向上移动的功能,一直到 StatusBar 的后面
我的 ViewController 中有一个自定义 View ,我想更新它的一些信息。此信息是从 Firebase 异步绘制的。 我正在尝试使用 view.setNeedsDisplay 或 view
我有一个 UIViewController,在 willRotateToInterfaceOrientation 中,我正在调用 [self view] setNeedsLayout]; 这个 Vie
我已经阅读了一些关于 setNeedsLayout 和 layoutIfNeeded 之间的区别的文章,而我关注的是: 1。如果我想要立即布局,我是否需要同时调用这两个方法,因为我已经多次看到这种组合
我的图层有几个动态属性,这些属性会影响图层本身的布局和/或显示。如果我从属性的 setter 发送 setNeedsLayout/setNeedsDisplay 可以吗?还是由 setter 的调用者
似乎呈现和关闭 View Controller 都会提示 呈现 View 以布局其 subview 和/或更新其约束。对于繁重的 View 层次结构,这会引入性能问题。再次 - 这是现有的,当前显示的
我是否将这些东西放入显示方法中?或者有类似的东西吗? 最佳答案 从 OSX 10.7 开始: - (void)layout 相当于layoutSubviews 现在有一个相同的setNeedsLayo
我已成功对 UITableViewCell 进行子类化,并且我正在使用子类在我的应用程序中布局一些 TableViewCell。现在,我正在尝试将图像延迟加载到单元格中。根据日志,图像下载工作正常,但
我正在调用 API。根据我返回的 json 数据,我正在 viewDidLoad() 中修改我的 View Controller ,以便更改我的 View 设计以尽可能最好地显示给定数据。 我所做的是
我知道自动布局链基本上包含 3 个不同的过程。 更新约束 布局 View (这里是我们计算帧的地方) 显示 我不太清楚-setNeedsLayout 和-setNeedsUpdateConstrain
我有一个主视图 Controller 显示在屏幕上,一个类(代表)在后台运行获取位置。当我得到结果时,我调用 View Controller 中的委托(delegate)方法来更新屏幕上的标签。我尝试
我是一名优秀的程序员,十分优秀!