iOS7

iOS7 がリリースされたので、iOS7 対応に関して書こうと思います。
Cocos2d-x ver.2.1.5 で iOS7 対応されたようですが、ver.2.1.5 未満で作成された既存の Cocos2d-x のプロジェクトを iOS7 対応する方法です。素直に Cocos2d-x のバージョンを上げればいいのですが、Cocos2d-x の本体の方を色々といじっている場合などは、なかなか面倒なところです。また、ver.1.x のプロジェクトなどもメジャーバージョンアップさせるのは結構厳しいところです。かと言ってメンテナンスはあるのでここでは必要最低限の対応方法で Xcode5 に対応させたいと思います。

なお、ここで書いている問題は既にリリースされているアプリを iOS7 で動作させても発生しません。あくまで、Xcode5 でビルドしたアプリを iOS7 で動作させたときの問題です。

私が ver.2.1.4 を使用しているプロジェクトを Xcode5 でビルドしたときに遭遇した問題点は下記の通りです。

  • ステータスバーが表示される
  • CCLabelTTF フォントで描画した文字が表示されないことがある
  • xib ファイルを使用していると xib ファイルを使用して描画したビューのレイアウトが崩れる

3つ目は特殊な例で、かつ Cocos2d-x とは直接関係ないので、今回は1つ目と2つ目の解決方法です。また、CCLabelTTF クラスを使用していると大量のエラーログが出ますが、これも描画の問題で発生しているので、下記の修正を行うことにより発生しなくなります。

ステータスバーを非表示にする

iOS7 では時計などのステータスバーが常に表示されます。
これを回避するには、RootViewController に下記メソッドを追加すれば非表示にできます。

- (BOOL)prefersStatusBarHidden {
    return YES;
}

追記(2013/11/20)
上記以外にも info.plist に下記設定を入れることで対応可能です。

  • View controller-based status bar appearance を NO にする。
    • view controller のステータスバーを非表示にします。
  • Status bar is initially hidden を YES にする。
    • スプラッシュ時のステータスバーを非表示にします。

CCLabelTTF フォントで描画した文字が表示されない

https://github.com/cocos2d/cocos2d-x/pull/2873
上記でこの問題の pull request があります。

文字のレンダリング部分を iOS7 に対応するように修正すれば対応可能です。
修正内容は下記の通りです。

cocos2dx/platform/ios/CCImage.mm クラスの下記の部分を修正すれば回避可能です。
static bool _initWithString メソッドの dim.width * 4 の部分を (int)dim.width * 4 にする

下記行を

[str drawInRect:CGRectMake(textOriginX, textOrigingY, textWidth, textHeight) withFont:font lineBreakMode:(UILineBreakMode)UILineBreakModeWordWrap alignment:align];

下記に修正

[str drawInRect:CGRectMake(textOriginX, textOrigingY, textWidth, textHeight) withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:(NSTextAlignment)align];

関連する投稿