iPad неправильно [[UIScreen mainScreen] bounds].size размеры

Я не знаю, происходит ли это из-за симуляторов или нового XCode, но я читал, что для этого есть решение. Решение заключается в использовании viewWillLayoutSubviews для создания сцены вместо viewDidLoad.

Итак, я попробовал это, но это не работает. В ландшафтном режиме для iPad всегда возвращаются размеры 768x1024 вместо 1024x768. Ранее, в XCode 5, viewWillLayoutSubviews делал свое дело. Но теперь в XCode 6 я не могу добиться такого поведения. У меня такая проблема на симуляторах 7.1. Симуляторы 8.0 работают нормально и правильно показывают размеры.

Вот мой GameSceneViewController.

@implementation GameViewController



- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;
    skView.showsDrawCount = YES;

    skView.showsPhysics = NO;

    if(!skView.scene){
    // Create and configure the scene.
        GameScene * scene = [GameScene sceneWithSize:skView.bounds.size];

        scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene.
        [skView presentScene:scene];
    }
}

- (BOOL)shouldAutorotate{return YES;}

- (NSUInteger)supportedInterfaceOrientations{return UIInterfaceOrientationMaskLandscape;}

- (void)didReceiveMemoryWarning{[super didReceiveMemoryWarning];}

- (BOOL)prefersStatusBarHidden {return YES;}

@end

В файле info.plist для поддерживаемых ориентаций интерфейса есть два элемента: UIInterfaceOrientationLandscapeRight и UIInterfaceOrientationLandscapeLeft.

Как я могу получить правильные размеры ширины и высоты в ландшафтном режиме iPad?


person Whirlwind    schedule 17.12.2014    source источник
comment
Размер экрана всегда будет одинаковым независимо от ориентации устройства. То же самое с размером окна ключа. Контроллеры представления — это те, которые вращаются внутри окна. Таким образом, вы либо поворачиваете свой вид, если добавляете его в окно напрямую, либо просто добавляете его в корневой контроллер представления, который будет иметь правильный размер.   -  person redent84    schedule 17.12.2014
comment
Хорошо, спасибо за ваш ответ. Я только что напечатал размеры окна, экрана, сцены, видов... Так что теперь я понял. Вы можете опубликовать свой ответ, чтобы я мог принять его. Также вы можете написать дополнительную информацию об этом, если считаете, что есть что еще упомянуть, но это не обязательно. Просто мне как читателю интересно :)   -  person Whirlwind    schedule 17.12.2014


Ответы (1)


Размер экрана всегда будет одинаковым независимо от ориентации устройства. То же самое с размером окна ключа. Контроллеры представления — это те, которые вращаются внутри окна. Таким образом, вы либо поворачиваете свой вид, если добавляете его в окно напрямую, либо просто добавляете его в корневой контроллер представления, который будет иметь правильный размер.

Например:

UIWindow* keyWindow = [UIApplication sharedApplication].keyWindow;
UIViewController* rootController = keyWindow.rootViewController;

CGSize screenSize = [UIScreen mainScreen].bounds.size;
CGSize windowSize = keyWindow.bounds.size;
CGSize rootControllerSize = rootController.view.frame.size;
CGSize rootControllerBoundsSize = rootController.view.bounds.size;
CGAffineTransform rootTransform = rootController.view.transform;

NSLog(@"Screen size: %@", NSStringFromCGSize(screenSize));
NSLog(@"Window size: %@", NSStringFromCGSize(windowSize));
NSLog(@"RootController frame size: %@", NSStringFromCGSize(rootControllerSize));
NSLog(@"RootController bounds size: %@", NSStringFromCGSize(rootControllerBoundsSize));
NSLog(@"RootController transform: %@", NSStringFromCGAffineTransform(rootTransform));

при выполнении в альбомной ориентации будет напечатано следующее:

Screen size: {768, 1024}
Window size: {768, 1024}
RootController frame size: {768, 1024}
RootController bounds size: {1024, 768}
RootController transform: [0, 1, -1, 0, 0, 0]

Ключевым здесь является преобразование, которое применяется к корню UIViewController при повороте устройства.

Чтобы получить размер экрана с учетом поворота устройства, вы можете использовать размер границ корневого контроллера.

person redent84    schedule 17.12.2014