Xcode 4.5 GM にアップグレードしたところ、ストーリーボードのビュー コントローラーに「4 インチ Retina」サイズを適用できることがわかりました。
ここで、iPhone 4 と 5 の両方で実行されるアプリケーションを作成したい場合、もちろんすべてのウィンドウを 2 回ビルドする必要がありますが、ユーザーが 3.5 インチ画面の iPhone を持っているのか、それとも 4 インチ画面の iPhone を持っているのかを検出し、ビューを適用する必要があります。
どうすればいいでしょうか?
ベストアンサー1
まず、新しい画面に合わせてすべてのビューを再構築したり、画面サイズごとに異なるビューを使用したりしないでください。
iOS の自動サイズ変更機能を使用すると、ビューを調整してあらゆる画面サイズに適応させることができます。
それはそれほど難しくありません。読んでくださいいくつかの文書それについて。そうすれば多くの時間を節約できます。
iOS 6では、この点に関しても新機能が追加されています。iOS 6 APIの変更履歴Apple Developerのウェブサイトで
新しいiOS 6をチェックしてください自動レイアウト機能。
とはいえ、本当にiPhone 5を検出する必要がある場合は、画面サイズ。
[ [ UIScreen mainScreen ] bounds ].size.height
iPhone 5 の画面の高さは 568 です。
これをすべて簡略化するマクロを想像してみてください。
#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
fabs
ここでイプシロンを使用するのは、 H2CO3 のコメントで指摘されているように、浮動小数点を比較するときに精度エラーを防ぐためです。
したがって、これからは標準の if/else ステートメントでこれを使用できます。
if( IS_IPHONE_5 )
{}
else
{}
編集 - より優れた検出
一部の人が述べているように、これはワイドスクリーンのみを検出し、実際の iPhone 5 は検出しません。
iPod touch の次のバージョンにもおそらくこのような画面が搭載されるでしょうから、別のマクロ セットを使用する可能性があります。
元のマクロの名前を変更しましょうIS_WIDESCREEN
:
#define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
モデル検出マクロを追加しましょう:
#define IS_IPHONE ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPhone" ] )
#define IS_IPOD ( [ [ [ UIDevice currentDevice ] model ] isEqualToString: @"iPod touch" ] )
この方法では、iPhone モデルとワイドスクリーンがあることを保証し、IS_IPHONE_5
マクロを再定義できます。
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
また、@LearnCocos2Dが述べているように、このマクロはアプリケーションがiPhone 5の画面に最適化されていない場合([メールアドレス]この場合、画面サイズは 320x480 のままになります。
最適化されていないアプリで iPhone 5 を検出する理由がわからないため、これは問題ではないと思います。
重要 - iOS 8 のサポート
iOS 8 では、クラスbounds
のプロパティがデバイスの向きUIScreen
を反映するようになりました。したがって、明らかに、以前のコードはそのままでは機能しません。
これを修正するには、nativeBounds
の代わりに新しいプロパティ を使用するだけです。bounds
これは、向きによって変化せず、縦向きモードに基づいているためです。
の寸法はピクセル単位で測定されるため、iPhone 5 の場合、高さは568 ではなく1136nativeBounds
になります。
iOS 7 以下もターゲットにしている場合は、nativeBounds
iOS 8 より前のバージョンを呼び出すとアプリがクラッシュするため、必ず機能検出を使用してください。
if( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] )
{
/* Detect using nativeBounds - iOS 8 and greater */
}
else
{
/* Detect using bounds - iOS 7 and lower */
}
以前のマクロを次のように適応させることができます。
#define IS_WIDESCREEN_IOS7 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
#define IS_WIDESCREEN_IOS8 ( fabs( ( double )[ [ UIScreen mainScreen ] nativeBounds ].size.height - ( double )1136 ) < DBL_EPSILON )
#define IS_WIDESCREEN ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_WIDESCREEN_IOS8 : IS_WIDESCREEN_IOS7 )
もちろん、iPhone 6 または 6 Plus を検出する必要がある場合は、対応する画面サイズを使用します。