SKScene iPad的高度宽度颠倒了

zee*_*ple 6 ios sprite-kit

我试图在仅支持横向模式的iPad应用程序中用瓷砖填充我的SKScene.在场景中我检测到h&w:

int h = [UIScreen mainScreen].bounds.size.height;
int w = [UIScreen mainScreen].bounds.size.width;
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

Dog*_*fee 12

尝试,而不是使用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];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1用于测试视图的场景不是零 - 我见过的大多数解决方案都没有考虑viewWillLayoutSubviews可能被重复调用的事实,即当视图大小或可见性发生变化时 (3认同)

all*_*tom 10

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

@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;
}
Run Code Online (Sandbox Code Playgroud)

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

万岁,现在你的游戏也处理设备轮换.

  • 希望我能多次投票.虽然上面和各种书籍中的viewWillLayoutSubviews技术在某种程度上起作用,如果你记录场景的实际宽度和高度,它们永远不会从初始设置改变.而上述内容负责初始化和更改. (2认同)