【问题标题】:UIView frames wrong in viewDidLayoutSubviews after upgrade to Xcode 8升级到 Xcode 8 后,viewDidLayoutSubviews 中的 UIView 帧错误
【发布时间】:2017-01-26 14:46:06
【问题描述】:

在我的每个 xib 中,它都询问我要使用什么默认设备。我选择了 iPhone 6 并将框架更新为建议的框架。现在,在 viewWill 或 viewDidLayoutSubviews 中受到影响的任何视图都被搞砸了。他们都有CGRect(0, 0, 1000, 1000)的框架。

这是我的代码:

self.headImage.layer.cornerRadius = ceilf(CGRectGetWidth(self.headImage.frame)/2);
self.headImage.layer.masksToBounds = YES;

想知道这是怎么回事以及是否有解决方案。谢谢

【问题讨论】:

  • 您能出示您的代码吗?
  • self.headImage.layer.cornerRadius = ceilf(CGRectGetWidth(self.headImage.frame)/2); ; self.headImage.layer.masksToBounds = YES; // 但是帧是错误的;它在 xib 中显示 CGRect(0, 0, 1000, 1000) 它的高度和宽度分别是 62 和 62;
  • xcode 8 更新后我遇到了完全相同的问题。 viewDidLayoutSubviews 上的第二个触发器给出了正确的帧。
  • 我也面临与 Xcode 8.0 相同的问题
  • 我通过在获取 myOwniew 框架之前调用 myOwniew.layoutIfNeeded() 解决了我的问题

标签: xcode frame xib


【解决方案1】:

我通过调用解决了我的问题

myOwnView.layoutIfNeeded() 

在获得myOwnView.frame之前

【讨论】:

  • 这可行,但我不确定为什么需要这样做。我会假设布局传递是在 didLayoutSubviews 回调之前完成的。
  • 这也适用于我,但我认为 viewDidLayoutSubviews() 的整个观点是视图已经布局?
  • didLayoutSubviews() 的呼吁下,基于约束的视图似乎仍在布局中。请参阅stackoverflow.com/a/28622285/8653957 了解更多信息。
  • 这里有同样的问题。即使调用了 didLayoutSubviews,子视图的 .frame 也是 {zero, zero}。我通过 setNeedsLayout() 然后 layoutIfNeeded() 强制布局通过来解决这个问题。 l 多么糟糕的 API。
【解决方案2】:

如果 viewDidLayoutSubviews 给了你错误的框架 - 在 layoutSubviews 上调用 layoutIfNeeded 可以解决问题!

override func layoutSubviews() {
    super.layoutSubviews()

    yourView.layoutIfNeeded()
    setGradientForYourView()

}

【讨论】:

  • 帮助我根据 UIScrollView 的更新帧设置 UIScrollView 的 contentSize。谢谢!
【解决方案3】:

当我从推送的ViewController 中返回时,这个问题发生在我身上,而ViewDidLayoutSubviews 的框架不正确。

我的视图width constraint 被设置为与父视图的宽度成比例,并且没有恒定的偏移量。我用offset constraints 替换了这个比例约束,现在可以正确计算帧。

此问题出现在 XCode 10、iOS 12、iPhone 6 Plus 上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多