SKScene iPad 高度宽度反转

Posted

技术标签:

【中文标题】SKScene iPad 高度宽度反转【英文标题】:SKScene iPad height width reversed 【发布时间】:2013-10-14 05:24:05 【问题描述】:

我正在尝试在仅支持横向模式的 iPad 应用程序中用图块填充我的 SKScene。在场景中,我检测到 h & w 是这样的:

int h = [UIScreen mainScreen].bounds.size.height;
int w = [UIScreen mainScreen].bounds.size.width;

不幸的是,发回的尺寸与它们需要的尺寸相反。 SO在视图控制器或视图的内容中讨论这个问题有很多主题,解决方案似乎是在viewWillAppear中检测屏幕大小,而不是在viewDidLoad中。然而,这似乎不是 SKScenes 的有效解决方案。

有什么建议吗?

【问题讨论】:

【参考方案1】:

尝试,不要使用viewDidLoad 并使用它

- (void)viewWillLayoutSubviews

    [super viewWillLayoutSubviews];

    SKView * skView = (SKView *)self.view;
    if (!skView.scene) 
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;

        SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
        scene.scaleMode = SKSceneScaleModeAspectFill;

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

【讨论】:

+1 用于测试视图的场景不为零 - 我见过的大多数解决方案都没有考虑到 viewWillLayoutSubviews 可能被重复调用的事实,即当视图大小或可见性发生变化时 你的意思是不要在viewController中使用viewDidLoad?我应该在哪个文件中实现 viewWillLayoutSubviews? SKScene、ViewController 还是其他地方? 在 ViewController 中,您会看到一个包含与上述内容基本相同的方法,但它是 ViewDidLoad,删除它,以及上述所有方法。 我试过了,它的行为似乎至少有所不同。但是当我这样做时: int h = [UIScreen mainScreen].bounds.size.height; int w = [UIScreen mainScreen].bounds.size.width;在场景中,我得到了不正确的尺寸。当一个人在场景中时,如何获得正确的横向模式高度和宽度? 使用self.frame,在那里你可以访问你需要的,即self.frame.size.height【参考方案2】:

在布局处理程序中初始化场景没有意义。 调整布局处理程序中的场景。 (这就是它的用途。)

@implementation SGOMyScene

    SKScene *scene;


- (void)viewDidLoad

    [super viewDidLoad];

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

    scene = [SGOMyScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    [skView presentScene:scene];


- (void)viewWillLayoutSubviews

    [super viewWillLayoutSubviews];

    SKView *skView = (SKView *)self.view;
    scene.size = skView.bounds.size;

您的场景应该实现 - (void)didChangeSize:(CGSize)oldSize 以将所有内容移动到正确的位置。

万岁,现在您的游戏也可以处理设备旋转了。

【讨论】:

希望我能多次投票。虽然在上面和各种书籍中看到的 viewWillLayoutSubviews 技术在一定程度上起作用,但如果您记录场景的实际宽度和高度,它们不会从初始设置改变。而上述内容负责初始化和更改。 另外,viewWillLayoutSubviews 也会在每次设备旋转时被调用,这很痛苦

以上是关于SKScene iPad 高度宽度反转的主要内容,如果未能解决你的问题,请参考以下文章

iPad Air 上的屏幕宽度和高度不正确

如何在ipad中获得指定宽度和高度的弹出框

iPad Safari:设备宽度是设备高度?

iPad上的iOS UIWebView窗口宽度和高度

iPad 模拟器上的 SKScene 问题无法在 Xcode 11 beta 7 中填满屏幕

适用于 iOS 和 iPad 的故事板