【问题标题】:Autolayout is not updating frames instantly in iOS8-Xcode6自动布局不会在 iOS 8-Xcode 6 中立即更新帧
【发布时间】:2014-10-09 09:38:03
【问题描述】:

我在XCode6 中使用autolayout

我已将以下约束应用于scrollview

我尝试在 iPhone 4Inchs 设备的 -viewDidLoad 和 -viewWillAppear 方法中访问此滚动视图的框架。这里的问题是,滚动视图的宽度在日志中显示为 600。但是在我使用autolayout 时,4Ichs 设备中的宽度应该是 300。 似乎autolayout 将在一段时间后应用。它在 -viewDidAppear 方法中显示正确的宽度为 300。

有没有办法在 -viewDidLoad 和 -viewWillAppear 方法中访问原始帧?

提前致谢。

【问题讨论】:

  • 这里没有问题。宽度是指在界面生成器中计算的宽度,而不是在预览屏幕中。在模拟器或设备上运行它。只要您正确设置约束就可以了。

标签: ios ios8 autolayout xcode6


【解决方案1】:

在布局传递发生之前,自动布局不会为您提供“正确”的帧大小。 viewDidLoad 为时过早,而我的脑海中 willAppear 可能也太早了。 viewDidLayoutSubviews 是正确的地方。

【讨论】:

    【解决方案2】:

    将此代码放在您的 viewDidLoad() 中

    self.view.setNeedsLayout();
    self.view.layoutIfNeeded();
    

    在访问scorllView.frame.size.width之前

    【讨论】:

    • 在-viewDidLoad方法-setNeedsLayout,-layoutIfNeeded之后观察到scorllView的帧,但是没有传递scorllView的最后一帧。 -viewDidLayoutSubviews 是我找到的解决方案。但是在 -viewDidLayoutSubviews 中获取原始帧并基于更新 UI 很烦人。我希望应该有更好的解决方案。
    • @AshokKumarS 我今天尝试了这两种方法来获取 UITextField 的更新框架。我在 viewWillAppear 中得到了框架。它给出了正确的框架。
    • 由于某种原因,我没有得到原始帧(但我在共享扩展中测试了它,而不是在主应用程序中)。但没关系,我正在使用 -viewDidLayoutSubviews 方法。如果我们在 -viewDidLoad 或 -viewWillAppear 中显式添加 -setNeedsLayout、-layoutIfNeeded 是否会影响性能(即使是一点点也是额外的成本)?
    【解决方案3】:

    从 viewDidLoad 和 viewWillAppear 来看,它的显示与界面构建器的尺寸相同。如果您的应用程序在 scrollView 框架上中继(如果您希望在 viewDidAppear 之前使用它们)在呈现之前调用 viewController 实例 view 方法。

    UIViewController *myVC = [[UIViewController alloc]init];
    [myVC view]
    [self.navigationController pushViewController:myVC];
    

    但这取决于应用程序的性能。

    【讨论】:

      猜你喜欢
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      相关资源
      最近更新 更多