Autolayout:updateConstraints 不会调用方向更改
Autolayout: updateConstraints doesn't get call on orientation change
我正在学习自动布局在 iOS 中的工作原理。为此,我创建了一个示例单视图应用程序,它具有一个视图控制器(初始视图控制器)和一个自定义视图(我们称之为示例视图)。我在具有自动布局约束的 Main.storyboard 中向视图控制器添加了示例视图。我在具有自动布局约束的示例视图中添加了一个按钮和一个标签。我重写了 SampleView.m 中的 layoutSubviews 和 updateConstraints 方法。这些重写的方法除了调用它们的超级实现外什么都不做。我为这两种方法都添加了一个断点并开始调试应用程序。以下是我的观察
我发现在SampleView中updateConstraints是在layoutSubviews方法之前调用的。然而,我读到很少 posts/answers 提到在 updateConstraints 之前调用 layoutSubviews。现在我很困惑什么是正确的机制?在 layoutSubviews 之前调用 updateConstraint,反之亦然。自动布局系统如何工作?
当我将设备从纵向旋转到横向或从横向旋转到纵向时,我发现 SampleView 的 updateConstraints 方法不会自动调用(但是 layoutSubviews 方法会自动调用),而我阅读few posts/answers 这表示在旋转时,updateConstraints 方法会自动调用。我又困惑了,哪一个是真的?
如果 updateConstrains 方法在方向更改时没有自动调用,那么我们如何在方向更改时对视图层次结构中的所有视图调用 updateConstraint 方法?在大多数父视图上调用 setNeedsUpdateConstraint 是否会在该视图的所有子视图上调用 updateConstraint?
布局过程一般是这样的:
第一步:更新约束,自下而上发生。通过调用 [view setNeedsUpdateConstraints] 触发,覆盖自定义视图的 [view updateConstraints]。这一步解决了约束。
第二步:布局,自上而下。通过调用 [view setNeedsLayout]、[view layoutIfNeeded]、覆盖自定义视图的 [view layoutSubviews] 触发。当 layoutSubviews 被调用时,我们有框架。
第三步: 显示,自上而下。通过调用 [view setNeedsDisplay] 触发,覆盖自定义视图的 [view drawRect:]。
所以,
updateConstraints 发生在 layoutSubviews 之前。约束基本上是添加到视图的父视图中的对象,描述了如何布局父视图的子视图。所以你确实需要在布局发生之前更新约束。
在方向改变时,约束没有改变,因此我认为 updateConstraints 不会被调用。
当方向发生变化时,我们如何在视图层次结构中的所有视图上调用 updateConstraint 方法?约束不需要更新,因为它们是关于视图如何相互关联的方式。相反,当方向改变时,最顶层视图的 (UIWindow) 框架将被更新,因此它的所有子视图都需要更新它们的框架以 符合您之前设置的约束 .
如有错误请指正:)
非常混乱。
一种看待它的方式是这样的:对于不同的方向,您可能会有 不同的约束。
这与 iOS 中的整个特征系统有关。 (你必须 1000% 熟悉,才能处理这个问题!:O )
考虑一个令人难以置信的自定义视图...
(注意 - 几乎可以肯定,这意味着随着大小的变化不断动画的视图,这通常是这种视图的全部要点。)
在令人难以置信的自定义视图中,您将持续"modifying constraints"...
但这意味着您将修改... "the constraints for one orientation"(即使那些碰巧目前未被使用)...并且...您将修改"the constraints for another orientation"(即使那些,碰巧目前没有被使用)。
您使用 updateConstraints() 来修改 "all" 约束(在大多数情况下,会根据 animating/changing 视图大小连续修改)- 这意味着all all 性状变化的约束,all 时间 - !
这是看待问题的一种重要方式!
我正在学习自动布局在 iOS 中的工作原理。为此,我创建了一个示例单视图应用程序,它具有一个视图控制器(初始视图控制器)和一个自定义视图(我们称之为示例视图)。我在具有自动布局约束的 Main.storyboard 中向视图控制器添加了示例视图。我在具有自动布局约束的示例视图中添加了一个按钮和一个标签。我重写了 SampleView.m 中的 layoutSubviews 和 updateConstraints 方法。这些重写的方法除了调用它们的超级实现外什么都不做。我为这两种方法都添加了一个断点并开始调试应用程序。以下是我的观察
我发现在SampleView中updateConstraints是在layoutSubviews方法之前调用的。然而,我读到很少 posts/answers 提到在 updateConstraints 之前调用 layoutSubviews。现在我很困惑什么是正确的机制?在 layoutSubviews 之前调用 updateConstraint,反之亦然。自动布局系统如何工作?
当我将设备从纵向旋转到横向或从横向旋转到纵向时,我发现 SampleView 的 updateConstraints 方法不会自动调用(但是 layoutSubviews 方法会自动调用),而我阅读few posts/answers 这表示在旋转时,updateConstraints 方法会自动调用。我又困惑了,哪一个是真的?
如果 updateConstrains 方法在方向更改时没有自动调用,那么我们如何在方向更改时对视图层次结构中的所有视图调用 updateConstraint 方法?在大多数父视图上调用 setNeedsUpdateConstraint 是否会在该视图的所有子视图上调用 updateConstraint?
布局过程一般是这样的:
第一步:更新约束,自下而上发生。通过调用 [view setNeedsUpdateConstraints] 触发,覆盖自定义视图的 [view updateConstraints]。这一步解决了约束。
第二步:布局,自上而下。通过调用 [view setNeedsLayout]、[view layoutIfNeeded]、覆盖自定义视图的 [view layoutSubviews] 触发。当 layoutSubviews 被调用时,我们有框架。
第三步: 显示,自上而下。通过调用 [view setNeedsDisplay] 触发,覆盖自定义视图的 [view drawRect:]。
所以,
updateConstraints 发生在 layoutSubviews 之前。约束基本上是添加到视图的父视图中的对象,描述了如何布局父视图的子视图。所以你确实需要在布局发生之前更新约束。
在方向改变时,约束没有改变,因此我认为 updateConstraints 不会被调用。
当方向发生变化时,我们如何在视图层次结构中的所有视图上调用 updateConstraint 方法?约束不需要更新,因为它们是关于视图如何相互关联的方式。相反,当方向改变时,最顶层视图的 (UIWindow) 框架将被更新,因此它的所有子视图都需要更新它们的框架以 符合您之前设置的约束 .
如有错误请指正:)
非常混乱。
一种看待它的方式是这样的:对于不同的方向,您可能会有 不同的约束。
这与 iOS 中的整个特征系统有关。 (你必须 1000% 熟悉,才能处理这个问题!:O )
考虑一个令人难以置信的自定义视图...
(注意 - 几乎可以肯定,这意味着随着大小的变化不断动画的视图,这通常是这种视图的全部要点。)
在令人难以置信的自定义视图中,您将持续"modifying constraints"...
但这意味着您将修改... "the constraints for one orientation"(即使那些碰巧目前未被使用)...并且...您将修改"the constraints for another orientation"(即使那些,碰巧目前没有被使用)。
您使用 updateConstraints() 来修改 "all" 约束(在大多数情况下,会根据 animating/changing 视图大小连续修改)- 这意味着all all 性状变化的约束,all 时间 - !
这是看待问题的一种重要方式!