【问题标题】:Issue while using viewDidLayoutSubviews使用 viewDidLayoutSubviews 时出现问题
【发布时间】:2015-10-15 10:00:23
【问题描述】:

我听说viewDidLayoutSubviews 是我们使用约束时更改布局的最佳位置。

于是我跳到viewDidLayoutSubviews

我在 SuperView 上创建了三个 UIViewsSubViewed。帧计算的代码我就不说了。

 [self.view addSubview:imgMiddleCircle];
 [self.view addSubview:imgFirstCircle];
 [self.view addSubview:imgLastCircle]; 

使用这块我正在添加这些圈子。

现在,当我在 viewDidLayoutSubviews 中运行我的代码时,我会看到以下屏幕:

当我切换到 viewWillLayoutSubviews 时,我在屏幕上看到了这个:

为什么我在viewDidLayoutSubviews 中获得了额外的两个圈子,即使我创建了三个圈子。

为什么viewWillLayout 给出正确的输出。

【问题讨论】:

  • viewDidLayoutSubviews 被多次调用,这就是您看到额外视图的原因。因此,它不是添加子视图的最佳位置。通常,您会在 viewDidLoad 中添加子视图,如果您确实确定要手动计算帧,请仅在 viewDidLayoutSubviews 中执行此操作
  • 你的意思是在内部多次调用viewDidLayoutSubviews....而且我不能使用viewDidLoad,因为我打开了自动布局。我正在根据现有控件进行计算。在viewDidLoad 中,我没有为现有控件获得正确的框架
  • @RahulMishra 在viewDidLayoutSubviews 中设置框架并在viewDidLoad 中添加子视图
  • 我正在以编程方式创建这些视图...

标签: ios objective-c autolayout layoutsubviews


【解决方案1】:

您应该针对viewDidLayoutSubviews 被称为多种类型这一事实进行编码。

理想情况下,addSubview: 应该发生在像 viewDidLoad 这样您确定它只被调用一次的地方。

您可以创建一个标志以避免调用addSubview: 倍数类型(不是我个人的选择)

否则,请尝试将您的设置代码移动到viewDidLoad 并在进行计算之前强制视图呈现自身:

[yourView setNeedsLayout];

[yourView layoutIfNeeded];

【讨论】:

    【解决方案2】:

    根据Apple Documentation

    当视图控制器视图的边界发生变化时,视图 调整其子视图的位置,然后系统调用它 方法。但是,调用此方法并不表示 视图的子视图的个别布局已调整。每个 subview 负责调整自己的布局。

    您的视图控制器可以覆盖此方法以在之后进行更改 视图列出了它的子视图。这个的默认实现 方法什么都不做。

    因此,基本上,viewDidLayoutSubiews 在创建 viewController 期间被多次调用,包括旋转设备、滚动等情况。因此,您应该非常小心添加到此方法的代码,因为它可能也被执行多次。 使用此方法重新定位您的子视图,而不是添加/删除它们。

    查看blog 了解更多详情。

    【讨论】:

    • 我想在我的视图中添加一个圆角的子层。我在 didLayoutsubviews 中添加了圆角代码,这很有意义,因为我的元素可以改变大小,我需要基于此采用圆角半径。现在我添加了图层插入代码,由于多次调用,添加了多个图层,该怎么办:(?
    猜你喜欢
    • 1970-01-01
    • 2011-06-14
    • 2019-08-11
    • 2021-10-30
    • 1970-01-01
    • 2015-11-13
    • 2019-03-30
    • 2013-04-14
    • 2012-07-31
    相关资源
    最近更新 更多