51

我有一个 iPad 应用程序。在横向UIViewController视图中,实际宽度 =1024px和高度 = 768 - 20 (statusBar) - 44 (navigationBar) = 704px

所以我想得到这个[1024 x 704]尺寸,我正在使用self.view.bounds它。它返回[748 x 1024],这是错误的!但是当我旋转屏幕两次(当前 -> 纵向 -> 当前)时,视图的边界是正确的 - [1024 x 704]

视图初始化如下:

- (void)loadView {
    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    self.view.backgroundColor = [UIColor lightGrayColor];
}

界限是这样的:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"bounds = %@", NSStringFromCGRect(self.view.bounds));
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    NSLog(@"bounds = %@", NSStringFromCGRect(self.view.bounds));
}

所以问题是..我怎样才能在一开始就获得正确的视图约束?

4

6 回答 6

47
于 2017-02-16T13:40:00.860 回答
34

根据其他一些答案,您看到的问题是因为在轮换发生之前viewDidLoad被调用。因为 iPad 总是以纵向模式初始化,所以如果您在 中获取尺寸值,它们将始终是纵向尺寸 - 这与您配置的任何方向无关。 viewDidLoad

要在定向/旋转发生后获取尺寸,请viewDidAppear.


我不太明白为什么 iOS 不能更好地处理这个问题 - 特别是考虑到您在项目设置中定义了方向,并且在 Xcode Interface Builder 中。但是,我确信这是有充分理由的;-)。

于 2013-09-05T05:50:35.593 回答
16

我一直用:

CGSize sizeOfScreen = [[UIScreen mainScreen] bounds].size;

获取屏幕的大小,并且:

CGSize sizeOfView = self.view.bounds.size;

得到view的大小。我刚刚在 viewDidLoad 上对其进行了测试,它返回了:

2012-07-17 10:25:46.562 Project[3904:15203] bounds = {768, 1004}

这是正确的,因为 CGSize 被定义为 {Width, Height}。

于 2012-07-17T13:19:50.540 回答
2

这是我在上一个项目中发现的:在 viewDidLoad 之后,self.view 的框架会根据这个屏幕是否有导航栏等进行调整。

因此,也许您想在 viewDidLoad 之后使用该值(可能在 viewWillAppear 或 viewDidAppear 中),或者通过减去条形高度来手动调整它。

于 2012-07-17T12:59:17.540 回答
2

我遇到了这个问题,发现限制范围viewDidAppear可以满足我的需要。

于 2012-09-06T20:31:57.557 回答
0

If you want to get correct bounds of view in ViewDidLoad method, you can use Dispatch async with delay for it. See this example below:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                // Get your bounds here
            }
于 2020-01-06T05:44:10.683 回答