【问题标题】:How do I get the correct view height in viewDidLayoutSubviews?如何在 viewDidLayoutSubviews 中获得正确的视图高度?
【发布时间】:2013-10-30 14:05:43
【问题描述】:
- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLog(@"viewDidLayoutSubviews view.height: %f", self.view.frame.size.height);
}

在上面,view.height总是 1024,无论设备处于什么方向。即使旋转设备也会导致调用viewDidLayoutSubviews,它仍然会输出 1024。

但视图渲染得很好。我到底错过了什么?

【问题讨论】:

  • 你期望的高度是多少?
  • 如何获得 view.height?你在 UIView 上有一个类别吗?这是哪个视图/视图控制器?这是你的根视图控制器吗?
  • @SimonGoldeen 抱歉,忘记解决了。它是根据框架定义的。是的,它是根视图控制器。

标签: ios objective-c cocoa-touch viewdidlayoutsubviews


【解决方案1】:

当 iOS 执行自动旋转时,它不会更改根视图控制器视图的 frame 属性。它所做的是应用变换并为变换变化设置动画。要查看视图的“实际”大小,请检查 bounds 属性而不是 frame 属性。

引用transform属性的Apple's documentation

警告:如果此属性不是恒等变换,则 frame 属性的值未定义,因此应被忽略。

【讨论】:

  • 谢谢!这似乎是一个非常奇怪的设计选择。我是否可以假设这根视图控制器上的情况?
  • @chaiguy 如果您对其中一个视图应用转换,同样的事情也会发生。它的框架不再必然反映它的大小或位置。至于Apple为什么这样做,那是因为旋转动画是通过动画transform变化来实现的(或者我假设)。
【解决方案2】:

我认为是时候更新 iOS8 了。在 iOS8 中:

  • UIScreen 现在是面向界面的:
  • [UIScreen 边界] 现在面向界面
  • [UIScreen applicationFrame] 现在面向界面
  • 状态栏框架通知是面向界面的
  • 键盘框架通知是面向界面的

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多