Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用layoutifneed?_Ios_Iphone_Uikit - Fatal编程技术网

Ios 如何使用layoutifneed?

Ios 如何使用layoutifneed?,ios,iphone,uikit,Ios,Iphone,Uikit,何时以及如何使用layoutifneed?我知道当我们更改视图的布局时,我们可以调用setNeedsLayout来更新布局,但不确定何时应该使用layoutifneed 注意:我在实际代码中使用了layoutIfNeeded,但忘记了它是在什么上下文中使用的。setNeedsLayout实际上调用了layoutIfNeeded,因此如果调用setNeedsDisplay,就没有理由调用layoutIfNeeded。通过这种方式,setNeedsLayout是调用layoutIfNeeded的一种

何时以及如何使用
layoutifneed
?我知道当我们更改视图的布局时,我们可以调用
setNeedsLayout
来更新布局,但不确定何时应该使用
layoutifneed


注意:我在实际代码中使用了
layoutIfNeeded
,但忘记了它是在什么上下文中使用的。

setNeedsLayout实际上调用了layoutIfNeeded,因此如果调用setNeedsDisplay,就没有理由调用layoutIfNeeded。通过这种方式,setNeedsLayout是调用layoutIfNeeded的一种方便方法,它可以完成繁重的工作。

layoutIfNeeded
强制接收器在需要时立即布局其子视图

假设您已经覆盖了
layoutSubviews
,并且UIKit认为您的视图出于任何原因需要布局(例如,您在处理某些用户操作时调用了
setNeedsLayout
)。然后,将立即调用自定义的
layoutSubviews
方法,而不是在常规UIKit运行循环事件序列中调用它时(在事件处理之后,但在
drawRect:
之前)

您可能需要在单个运行循环中调用
layoutIfNeeded
的原因示例:

  • 可以调整包含具有自定义布局的表视图的自定义视图的大小
    setNeedsLayout
    已设置,以便稍后调用
    layoutSubviews
  • 控制器对象要求表视图在处理用户事件时滚动到某个特定单元格
  • 自定义视图在
    layoutSubviews
    中对表视图执行一些自定义大小调整,以更改表视图大小

  • 问题是,当控制器要求表视图滚动(步骤2)时,表视图的边界已过时。更新后的边界将仅在以后的表视图上设置(步骤3)。完成
    layoutSubviews
    后,控制器希望表格视图滚动到的内容可能实际上不可见。然后,解决方案是控制器在知道可能发生这种情况时调用
    layoutifneedd

    现在可以通过参考更新周期来描述这两种方法之间的差异

    UIView的方法setNeedsLayout告诉系统,您希望它在更新周期开始时布局并重新绘制该视图及其所有子视图。这是一个异步活动,因为该方法立即完成并返回,但直到稍后的某个时间,布局和重画才真正发生,而且您不知道更新周期将在何时结束

    相反,layoutifneedd方法是一个同步调用,它告诉系统您需要一个视图及其子视图的布局和重画,并且您希望在不等待更新周期的情况下立即完成。完成对此方法的调用后,布局已根据方法调用之前注意到的所有更改进行了调整和绘制

    因此,简洁地说,layoutIfNeeded表示请立即更新,而setNeedsLayout表示请更新,但您可以等到下一个更新周期

    LayoutSubViews()-不要直接调用,而是调用 setNeedsLayout(),如果约束基不提供,则重写 行为

    SetNeedsLayout()-在主线程上调用,它将等待下一个绘图周期。 性能良好

    LayoutIfNeed()-立即布局子视图


    事实并非如此。setNeedsLayout将为布局标记视图,这将导致在另一个运行循环中调用LayoutSubView。调用layoutfneeded将导致在同一运行循环中调用layoutSubviews。要测试此功能,请在LayoutSubView中设置一个断点,然后在调用setNeedsLayout时设置一个断点。如果前进一行,则会注意到没有打断布局子视图。但是,如果在LayoutFneed上打断并前进一行,您会注意到在前进之前将在LayoutSubview中打断。