问题标签 [viewdidlayoutsubviews]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
8921 浏览

ios - 为什么 viewDidLayoutSubviews 仅在第一次运行时被调用两次?

这让我快疯了。只有在第一次运行时 viewDidLayoutSubviews 才会被调用两次。

这是我正在使用的代码:

在我的 ViewController 我称之为:

0 投票
1 回答
220 浏览

xcode - 覆盖子视图中 UIButton 的自动布局中心值 @ viewDidLayoutSubviews

我将 Autolayout 用于相当复杂的菜单,并且确实需要它。我的菜单的所有按钮、UIViews 等都在一个名为“menuSubview”的单独 UIView 中。

如果用户按下一个按钮,整个“menuSubview”就会移动到另一个位置以显示菜单的其他部分。有时 menuSubview 中的按钮也会移动。我总是保存“菜单状态”(在 get-set 变量“lastMenu”中使用 Userdefaults),并具有根据保存的“菜单状态”设置 alpha 和中心的功能。

我尝试在 viewDidAppear、viewDidLayoutSubview 中调用“openLastMenu”函数——ViewController 的所有“viewDid”函数。按钮的“menuSubview”中心和 alpha 始终按预期运行......但按钮的中心根本不会 - 无论我调用什么“viewDid”函数。

(代码要复杂得多——我把它归结为调试和陈述我的观点)

为了调试,我什至制作了一个按钮子类来获取带有“didSet”的“中心”值,如果它们发生变化。似乎在采用正确的值后,它们再次更改为它们的 Autolayout-Position。

...哦,忽略按钮上带有“translatesAutoresizingMaskIntoConstraints”的约束总是会搞砸整个菜单。我开始在这里发疯了:)

0 投票
2 回答
156 浏览

ios - UIView 什么时候知道它有多大?

我有一个 UIView 的子类,它使用 CAShapeLayers 在自身上绘制图片。我希望绘图适应 AutoLayout 给出的 UIView 的任何大小。我给它一个drawGraph()函数,从它获取当前大小.bounds.size,然后绘制一张适合的图片。

我首先在容器 UIViewController's 中调用我的绘图函数viewDidLoad(),但此时布局尚未发生,因此它具有故事板中的任何边界。

我尝试从视图控制器调用它viewDidLayoutSubviews(),但这也不完全令人满意。它被调用了两次:首先使用情节提要的边界,然后再次使用更新的(正确的)边界。两者之间有一个暂停,因此用户可以看到绘制和重绘。

如何判断 UIView 是否已应用其布局约束并准备好为我提供准确的尺寸?

0 投票
3 回答
63 浏览

ios - 被 viewController 方法的奇怪行为搞糊涂了

我已经覆盖了一个方法

现在发生的事情是,当我在 Iphone 6、6+ 上运行我的应用程序时,一切正常。iphone5但是,当我在(模拟器 + 真实设备)上运行相同的代码时,viewDidLayoutSubViews会被无限次调用,并且我的应用程序变得无响应。我通过使用布尔变量解决了这个问题。但我不明白为什么会这样。所以有人可以向我解释一下。

谢谢 :-)

0 投票
0 回答
92 浏览

swift - 斯威夫特:子视图监听父调用viewDidLayoutSubviews

我有一个自定义集合视图,其单元格大小由视图控制器确定。因为布局是在单元格大小之前设置的(单元格大小设置在 中cellForItemAtIndexPath),所以布局不能正常工作,除非它设置在视图控制器的viewDidLayoutSubviews. 有没有办法让自定义集合视图在视图控制器调用时进行监听viewDidLayoutSubviews?我想尽可能多地保留在自定义集合视图中。

先感谢您!

0 投票
2 回答
4094 浏览

ios - 使用 UINavigationController 弹出顶视图时不再调用 viewDidLayoutSubviews

iOS 10,不断打破的礼物,似乎改变了另一种行为。

假设两个 UIViewController 被推送到一个 UINavigationController 上。

在 iOS 8/9 上,调用navigationController?.popViewController(animated: true)弹出顶部 UIViewController(比如 VC2)会导致viewDidLayoutSubviews底部视图控制器(比如 VC1)被调用。

我们依靠这个来刷新VC1。有时 VC2 向 VC1 添加子视图(通过数据模型),这需要在弹出回 VC1 时反映出来。

需要准确的帧信息。我们无法使用viewWillAppear,因为iOS 9 上的帧数据错误。问题viewDidAppear是在最初看到视图和调整之间存在短暂的故障。

viewDidLayoutSubviews现在弹出 VC2 时不会调用VC1 。

1)这是一个viewDidLayoutSubviews不能被调用的错误吗?

2) 使用 UINavigationController 弹出时刷新视图控制器的正确方法是什么?

0 投票
2 回答
11647 浏览

ios - 究竟什么是 viewDidLayoutSubviews?

我正在阅读以下内容的viewDidLayoutSubviews描述UIViewController

被调用来通知视图控制器它的视图刚刚布置了它的子视图 [...] 但是,这个方法被调用并不表示视图子视图的各个布局已经被调整。每个子视图负责调整自己的布局 [...]。

对我来说,这意味着:“当子视图的布局完成时调用,但实际上这不是真的”。那么真正的背后是viewDidLayoutSubviews什么?

0 投票
0 回答
104 浏览

ios - 如何在 Swift/iOS 中获取特定于设备大小的自动布局的回调?

在自动布局完成运行应用程序的设备的布局后,我想在我的 UIView 中放置几个​​按钮/图像。例如,在我的故事板中,我将屏幕尺寸设置为 iPhone 7。但是在设备(比如 iPad)的自动布局完成后,我想放置几个UIImagesView(s)。我计划使用viewDidLayoutSubviews,但似乎在每个布局之后都会调用它,即当我的应用程序执行达到这个特定值UIViewController时,首先viewDidLayoutSubviews调用 iPhone 7 大小的屏幕,然后它会根据当前设备大小调整情节提要中的所有元素(通过为iPad)和viewDidLayoutSubviews之后第二次调用。现在这对我来说是个问题,因为我绘制的图像视图的位置取决于情节提要中某些元素的位置。所以本质上,我画了两次图像视图(一次考虑 iPhone 7 尺寸,第二次考虑设备尺寸)。我只想要后者。有没有办法知道当前设备大小的自动布局何时发生?

0 投票
1 回答
859 浏览

uiview - 在哪里放置父视图使用自动布局的 UIView 的手动布局代码?

当父视图本身使用自动布局时,我拥有的特定子 UIView 应该在哪里放置手动布局代码(或在哪里触发它)?

笔记:

  1. 视图的布局代码需要在任何父视图布局、方向更改、特征更改等之后使用其框架尺寸
  2. 我曾尝试在父视图控制器上使用 viewWillLayoutSubviews,但在多次调用它时遇到困难 - 无法追查为什么但不想多次手动布局计算,因为它们很繁重。
  3. 因此,总体而言,对于以下各种场景,最终只有一个手动布局的“触发”,并且在所有旋转和父视图布局完成时:

所以:

  • 加载时 (viewDidLoad)
  • 重新显示(就像视图随后确实出现了)
  • 回转
  • 性状改变

例如,我应该寻找一种方法:

a)父视图控制器来控制它并确定何时向我的特定子视图(由它自己的视图控制器前置)发送“layoutSubviewNow”调用,但在这种情况下如何执行此操作,或 b)

b)让子视图对“layoutSubview()”做出反应,然后有一个委托可用于回调主控制器以请求布局数据?或

c) 类似于 b) 但使用子视图视图控制器“viewWillLayoutSubviews()”来触发,然后有一个委托可用于回调主控制器以请求布局数据?

或其他?

其实我在想这个主意:

d) 在主父视图控制器中:有一个实例变量 viewTransistionedOutstandingAction,并使用它以便 (i) 在 vi​​ewWillTransition 中将其设置为 true,然后在 (ii) viewWillLayoutSubviews 中执行以下操作:

0 投票
2 回答
861 浏览

ios - iOS 10 自动布局 - 重复调用 viewDidLayoutSubviews

整个 Storyboard 都启用了 AutoLayout。

当我将日志放入viewDidLayoutSubviews()时,我可以看到它被反复调用,并且永不停止。

我在视图控制器中没有任何自动布局红旗。

这可能是什么原因造成的?调试此问题的最佳方法是什么?...找出哪个视图正在苦苦挣扎?


更新

原来是一个 UILabel 制造了这个麻烦。即使它具有所有 4 个约束(x、y、宽度、高度)它似乎正在调用树上的重新布局......