iOS8からSKViewのpausedが勝手に変更される件

Swiftでの解決方法は見つかるんだけど、
Objective-Cの場合はどうしたら良いの?ということで、
まずは、状況の再現から。

とりあえず、適当にプロジェクトを作成する。
TemplateはGameで、
LanguageはObjective-C
Game TechnologyはSpriteKit

次に、新規にCocoa Classを追加して、SKViewを継承する。

こんな感じ。

FOOGameView.h

#import <SpriteKit/SpriteKit.h>

@interface FOOGameView : SKView

@end

FOOGameView.m

#import "FOOGameView.h"

@implementation FOOGameView

- (void)setPaused:(BOOL)newValue
{
    NSLog( @"setPaused newValue: %d", newValue );
    super.paused = newValue;
}

@end

次に、GameViewController.mを書き換える。

#import "GameViewController.h"
#import "FOOGameView.h" // <-- 追加
#import "GameScene.h"

//(省略)

@implementation GameViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Configure the view.
    FOOGameView * skView = (FOOGameView *)self.view; // <-- 変更
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;
    /* Sprite Kit applies additional optimizations to improve rendering performance */
    skView.ignoresSiblingOrder = YES;
    
    // Create and configure the scene.
    GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    
    // Present the scene.
    [skView presentScene:scene];
}

//(省略)

それと、もう一つ。
Main.storyboardを選択して、黒い部分を選んで、
Custom ClassのClassに先ほど追加したクラスを設定する。
今回の場合だと、SKViewからFOOGameViewに書き換える。

さて、再現してみる。
iPhone 5s(8.3)の場合は、
Homeボタンを押したり、アイコンをタップしたりするとログが出力され、
iPhone 5s(7.1)の場合は、ログが出力されない。(*1)

さて、どうしたものか・・・。

おしまい。

(*1) Preferences...Downloadsタブを選んで、iOS 7.1 Simulatorをインストールする必要がある

Leave a Comment