2013-10-14 11 views
6

SKScene'ı yalnızca yatay modu destekleyen bir iPad uygulamasında fayanslarla doldurmaya çalışıyorum. sahne içinde w gibi h & tespit:SKScene iPad yükseklik genişliği ters çevrildi

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

Ne yazık ki, geri gönderilen boyutları, olması gereken tersidir. SO'da bu konuyla ilgili bir çok konu vardır. Bu problem, bir görünüm denetleyicisinin veya bir görünümün içeriğinde tartışılır ve çözüm, viewDidLoad'da değil, viewWillAppear'daki ekran boyutunu algılamak gibi görünür. Bununla birlikte, bu SKScenes için geçerli bir çözüm gibi görünmemektedir.

Herhangi bir öneriniz var mı?

cevap

12

deneyin, viewDidLoad kullanarak ve bu

- (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]; 
    } 
} 
+3

+1 görünümün sahnesinin sıfır olmadığından emin olmak için +1 - gördüğüm çoğu çözüm, viewWillLayoutSubviews öğesinin tekrar tekrar çağrılabileceğini düşünmüyor, örneğin görünüm boyutu veya görünürlük değiştiğinde – LearnCocos2D

+0

ViewDidLoad kullanmadığınız anlamına mı geliyor? viewController içinde? ViewWillLayoutSubviews dosyasını hangi dosyada uygulamalıyım? SKScene, ViewController veya başka bir yerde? – zeeple

+0

ViewController'da, yukarıdakiyle aynı içeriği içeren bir yöntem görürsünüz, ancak ViewDidLoad, bunu kaldır ve yukarıdaki tüm yöntemleri. – DogCoffee

10

O için mantıklı değil kullanmayan düzen işleyicisi sahne başlatın. Düzen işleyicide sahneyi yeniden boyutlandırın. (Yani için olan budur.)

@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; 
} 

Senin sahne doğru yerde her şeyi taşımak için - (void)didChangeSize:(CGSize)oldSize uygulamalıdır.

Yaşasın, artık oyunun cihaz rotasyonlarını da ele alıyor.

+2

Bu birkaç kez oy verebilirdim. Yukarıdaki ve çeşitli kitaplarda görülen viewWillLayoutSubviews tekniği, sahnenin gerçek genişliğini ve yüksekliğini ilk ayardan hiçbir zaman değişmeyecek şekilde kaydederseniz bir ölçüde çalışır. Yukarıdakiler başlangıç ​​ve değişim ile ilgilenirken. – TJA

+0

Ayrıca viewWillLayoutSubviews, cihazların her döndüğü zaman da denir; –