iPhone 5(ワイドスクリーンデバイス)を検出するにはどうすればいいですか?質問する

iPhone 5(ワイドスクリーンデバイス)を検出するにはどうすればいいですか?質問する

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 以下もターゲットにしている場合は、nativeBoundsiOS 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 を検出する必要がある場合は、対応する画面サイズを使用します。

おすすめ記事