1. ホーム
  2. iphone

[解決済み】iPhone5(ワイドスクリーンデバイス)を検出する方法は?)

2022-03-31 09:38:37

質問

Xcode 4.5 GMにアップグレードしたところ、ストーリーボードでビューコントローラーに「4" Retina」サイズを適用できるようになったことが判明しました。

iPhone 4 と 5 の両方で動作するアプリケーションを作成したい場合、もちろんすべてのウィンドウを 2 回ビルドする必要がありますが、ユーザーが 3.5" と 4" のどちらの画面を持つ iPhone を持っているかを検出し、ビューを適用する必要があります。

どうすればいいのでしょうか?

どのように解決するのですか?

まず第一に、新しい画面に合わせてすべてのビューを再構築したり、画面サイズごとに異なるビューを使用したりするべきではありません。

を使用します。 オートリサイズ の機能により、ビューを調整し、あらゆるスクリーンサイズに適応させることができます。

それはとても難しいことではありません。 ドキュメント についてです。多くの時間を節約することができます。

iOS 6では、これに関する新機能も提供されています。

を必ずお読みください。 iOS 6 API チェンジログ をご覧ください。

そして、新しい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のモデル AND を再定義し、ワイドスクリーンを追加します。 IS_IPHONE_5 マクロを使用します。

#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )

また、@LearnCocos2D が言っているように、アプリケーションが iPhone 5 のスクリーンに最適化されていない([email protected] イメージがない)場合、このマクロは機能しません。そのような場合、スクリーンサイズは 320x480 のままだからです。

最適化されていないアプリでiPhone 5を検出する理由はないと思うので、これは問題ないかもしれませんね。

重要 - iOS 8への対応

iOS 8では bounds プロパティの UIScreen クラスに反映されるようになりました。 デバイスの向き .

ですから、明らかに、前のコードは箱から出しても動きません。

これを解決するためには、単純に新しい nativeBounds プロパティの代わりに bounds というのは、向きによって変化しないし、ポートレート・アップ・モードが基本だからです。

の寸法に注意してください。 nativeBounds はピクセルで測定されるので、iPhone 5 の場合、高さは 1136 568ではなく、568です。

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を検出する必要がある場合は、当然ながら、対応する画面サイズを使用します。