GADGET FACTORY 雑記帳

iPhone アプリ / Flash コンテンツ /Adobe AIR などを開発していて気づいたことや備忘録、TIPS、HACKなど

Xcode6 の iPhone シミュレーターで iOS8 に設定した際の「@3x」画像の挙動がおかしい

本日、既存アプリを iOS8対応ならびに、iPhone6 / iPhone6 Plus 向けへの対応を行うための作業工数を調査しておりました。
iPhone6 Plus 向けの画像を設定するのに、今回あらたに追加された画像サイズ「@3x」のテストを行っておりました。

iPhone 画像サイズの種類

iPhone3GS 用の画像は、画面解像度 320x480 に配置する画像サイズ。

そして、iPhone4以降のRetinaディスプレイに対応するために用意された画像が「@2x」。
画像ファイル名に「@2x」を追加しておけば、Retina対応端末では自動的にその画像を利用してくれる設定。

  • iPhone4/4s の解像度 640x960
  • iPhone5/5s/5c の解像度 640x1136
  • iPhone6 の解像度 750x1334

で利用されます。

さらに、今回「@3x」という、iPhone6 Plus 用の設定が追加されました。
現時点では、

  • iPhone6 Plus の解像度 1242x2208(表示は1080x1920にダウンスケーリングされます)

でのみ利用されます。

本来であれば、上記の3種類の画像をプロジェクト内に持っておけば、再生する iPhone 端末の状況に応じて、自動的に判別して表示する画像を変更してくれます。

例えば、「hoge.png」というiPhone3GS用画像を用意した場合、
hoge@2x.png」という画像を用意すれば iPhone4 〜 iPhone6で利用され、
hoge@3x.png」という画像を用意すれば iPhone6 Plusで利用される
ということになります。

調査していたプロジェクトについても、Retina 端末までは対応しておりますので、画面レイアウトの調整は発生するとしても(この作業自体も少々手間がかかりそうなのですが・・・)、画像の切替については、「@3x」のみを追加すれば、自動判別してくれると思っておりましたが・・・


Xcode6 の iPhone シミュレーターでの挙動

本格作業に入るまでに、「@3x」を追加した挙動をテストしておこうと、アプリ内で使用している画像1つを、無印、「@2x」、「@3x」の3サイズ分用意して、実際にどのように表示されるのかをテスト。

  • iPhone6 Plus(iOS8) シミュレーターで確認したところ、「@3x」画像が表示 : 正しい
  • iPhone6(iOS8) シミュレーターで確認したところ、「@3x」画像が表示 : おかしい
  • iPhone5s(iOS8) シミュレーターで確認したところ、「@3x」画像が表示 : おかしい
  • iPhone4s(iOS8) シミュレーターで確認したところ、「@3x」画像が表示 : おかしい
  • iPhone5s(iOS7.0) シミュレーターで確認したところ、「@2x」画像が表示 : 正しい
  • iPhone4s(iOS7.0) シミュレーターで確認したところ、「@2x」画像が表示 : 正しい
  • iPhone5s(iOS7.1) シミュレーターで確認したところ、「@2x」画像が表示 : 正しい
  • iPhone4s(iOS7.1) シミュレーターで確認したところ、「@2x」画像が表示 : 正しい

シミュレーターの端末で利用する iOSのバージョンを iOS8 にすると、画像ファイルは「@3x」が利用されてしまいます。

もしかして、起動用ファイル(Default.png)の設定を、端末分用意しないとだめなのかと思って、

  • Default.png (320x480)
  • Default@2x.png (640x960)
  • Default-568h@2x.png (640x1136)
  • Default-667h@2x.png (750x1334)
  • Default-736h@3x.png (1242x2208)

をプロジェクトに組み込んでみたものの、挙動は変化せず。

思わぬところで、調査につまずいてしまいました。
他に何か設定で見落としているところはないかと、色々とネットを調べたところ、海外で同じ現象について記載しているサイトを発見。
しかし、それに対しての解決方法は記載されておらず、そのまま断ち消えとなっている状態。

これは、Apple が発表している挙動とは、明らかに異なっている不具合と思われます。

シミュレーターだけでの動作不具合なのか、それとも実機でも発生する不具合なのか。
実機でも発生する現象であった場合、全ての画像について、端末ごとに表示する分岐処理をコードで記載していく必要が発生してしまいます。

実機での挙動を検証しようにも、iOS8がインストールされている実機は、現状手持ちに存在しておりません。

さらには、すでに iOS8.1 がリリースされている以上、手持ちの端末から iOS のアップデートをかけても、ダウンロードされるのは iOS8.1 のみ。
八方ふさがりに近い状態。

Xcode6 をアップデートしてみたら

そういえば、シミュレーターで iOS8.1のテストをしていないということを思い出し、テストをしようとしたところ、選択項目の中に iOS8.1 が表示されていませんでした。
iOS8.1 用の設定ファイルをまだダウンロードしていないことに気づき、その設定をダウンロードすることに。

[Xcode]-[Preferences] でウィンドウを開き、[Downloads]タブをタップして、[Components]の欄を確認したところ、iOS8.1 の設定が表示されない。

ならばと、App Store アプリを起動して、[アップデート]を確認したところ、Xcode6.1 の新しいアップデートが。
詳細に「Includes SDKs for OS X 10.10 Yosemite, OS X 10.9 Marvericks, and iOS 8.1」という表記もあります。
さっそく、ダウンロードして、アップデートしてみます。

そして、アップデートした Xcode6.1 で、先ほどのプロジェクトをテストしてみたところ

  • iPhone6 Plus(iOS8.1) シミュレーターで確認したところ、「@3x」画像が表示 : 正しい
  • iPhone6(iOS8.1) シミュレーターで確認したところ、「@2x」画像が表示 : 正しい
  • iPhone5s(iOS8.1) シミュレーターで確認したところ、「@2x」画像が表示 : 正しい
  • iPhone4s(iOS8.1) シミュレーターで確認したところ、「@2x」画像が表示 : 正しい

と、全て正しい表示となりました。

Xcode6.1 に入っている iOS8.1 のシミュレーターでは正しい挙動をしてくれるようです。
一応、「@3x」設定を行っても、判別してくれることが確認できました。

作業工数の見積については、そのまま「@3x」が動作するものとして、行うことができますので、今回の調査はここまでとなりました。

実際に、iOS8の実機での挙動がどうなるのかは、現在も不明のままです。

ただ、Apple の設定に合わせたアプリを作成しておけば、万一正しい画像が表示されない場合でも、言い訳が立つのかなぁという感じです。

iOSの(もしかしたらシミュレーターのみで発生しているかもしれない)不具合に対応するために、不要な作業工数が増加してしまうよりは、こういう事情ですとクライアントへ伝えた方が、良いと思いますので。
万一、これにも対応する必要がある場合は、別途作業工数が増加する旨は、伝えておきますが、対応するかしないかはクライアント判断にお任せするしかないというのが正直な所ですね。