iPad错误[[UIScreen mainScreen]界限] .size尺寸

时间:2014-12-17 15:57:01

标签: xcode ipad sprite-kit viewcontroller scene

我不知道是因为模拟器还是新的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 文件中有两个项目:UIInterfaceOrientationLandscapeRightUIInterfaceOrientationLandscapeLeft

如何在iPad横向模式下获得正确尺寸的宽度和高度?

1 个答案:

答案 0 :(得分:2)

无论设备方向如何,屏幕尺寸始终相同。密钥窗口大小相同。视图控制器是在窗口内旋转的视图控制器。因此,如果要将视图直接添加到窗口中,或者只是将其添加到根视图控制器(您将具有正确的大小),则可以旋转视图。

例如:

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的转换。

要获得考虑设备旋转的屏幕大小,您可以使用根控制器边界大小。