SKView bounds.size переворачивается на сенсорное событие (Sprite Kit)

Пожалуйста, помогите мне понять следующее поведение (iOS Sprite Kit).

Вывод кода, который я представляю ниже:

1.skView.bounds.size = 768,00, 1024,00

2.skView.bounds.size = 1024,00, 768,00

Как видно выше, ширина и высота переключаются между двумя методами, и это приводит к тому, что моя вторая сцена представляется не в правильном масштабе.

Моя игра будет работать только в ландшафтном режиме, что означает, что на самом деле второе соотношение ширины и высоты является правильным (хотя именно оно отображает сцену в правильном соотношении сторон, что само по себе для меня загадка),

Может кто-нибудь сказать мне, как я могу исправить это поведение? Что я делаю неправильно?

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.currentGameState = GS_INTRO_SCENE;

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

    // Create and configure the scene.

    printf("1.skView.bounds.size = %.2f, %.2f\n", skView.bounds.size.width, skView.bounds.size.height);

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

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

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (self.currentGameState == GS_INTRO_SCENE) {
        self.currentGameState = GS_GAME_PLAY;

        SKView * skView = (SKView *)self.view;

        printf("2.skView.bounds.size = %.2f, %.2f\n", skView.bounds.size.width, skView.bounds.size.height);

        SKScene *nextScene = [SKTMyScene sceneWithSize:skView.bounds.size];
        nextScene.scaleMode = SKSceneScaleModeAspectFill;

        SKTransition *fadeIn = [SKTransition fadeWithDuration:5.0f];

        [skView presentScene:nextScene transition:fadeIn];
    }
}

Я очень ценю это заранее.

** редактировать: **

@giorashc решил мою проблему, предложив перенести инициацию сцены в метод -(void)viewWillLayoutSubviews.

Но моя вторая сцена остается растянутой.... вот полный код для SKTViewController.m после изменения (кто-нибудь может сказать, почему второй вид все еще растянут?):

//
//  SKTViewController.m
//  SpriteKitTest
//
//  Created by Claudia Dazcal on 13/07/14.
//  Copyright (c) 2014 DazcalFamily_inc. All rights reserved.
//

#import "SKTViewController.h"
#import "SKTMyScene.h"
#include "SKTGameIntroScene.h"

typedef enum
{
    GS_INTRO_SCENE,
    GS_GAME_PLAY
}GameStates;

@interface SKTViewController ()

@property GameStates currentGameState;
@property BOOL firstSceneLoaded;

@end

@implementation SKTViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.currentGameState = GS_INTRO_SCENE;

    self.firstSceneLoaded = NO;

}

-(void)viewWillLayoutSubviews
{
    if (!self.firstSceneLoaded) {
        self.firstSceneLoaded = YES;

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

        // Create and configure the scene.

        printf("1.skView.bounds.size = %.2f, %.2f\n", skView.bounds.size.width, skView.bounds.size.height);

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

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

    }

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (self.currentGameState == GS_INTRO_SCENE) {
        self.currentGameState = GS_GAME_PLAY;

        SKView * skView = (SKView *)self.view;

        printf("2.skView.bounds.size = %.2f, %.2f\n", skView.bounds.size.width, skView.bounds.size.height);

        //CGSize DebugSize = CGSizeMake(skView.bounds.size.height, skView.bounds.size.width);

        //SKScene *nextScene = [SKTMyScene sceneWithSize:DebugSize];
        SKScene *nextScene = [SKTMyScene sceneWithSize:skView.bounds.size];
        nextScene.scaleMode = SKSceneScaleModeAspectFill;

        //SKTransition *fadeIn = [SKTransition fadeWithDuration:5.0f];

        //[skView presentScene:nextScene transition:fadeIn];
        [skView presentScene:nextScene];
    }
}

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    } else {
        return UIInterfaceOrientationMaskAll;
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

@end

* редактировать 2 **

Хорошо, теперь все решено.

@giorashc сразу же решил мою проблему, предложив перенести инициацию сцены в viewWillLayoutSubviews. Оказывается, поскольку ранее я работал с неправильными границами, я настроил исходную сцену с неправильными значениями, и теперь, когда она была исправлена, она выглядела растянутой.

Но это сейчас исправлено. Большое спасибо @giorashc!!

2 ответа

Решение

Инициализируйте вашу сцену в viewWillLayoutSubviews метод. В этом методе границы вида обновляются корректно.

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

В первом методе вид еще не повернут в ландшафтный режим. Во втором он перешел в ландшафтный режим, поэтому теперь сообщает о границах, которые шире, чем высота.

Другие вопросы по тегам