[解決済み】iPhone5(ワイドスクリーンデバイス)を検出する方法は?)
質問
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を検出する必要がある場合は、当然ながら、対応する画面サイズを使用します。
関連
-
[解決済み] NSComparisonResultとNSComparator - これらは何ですか?
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み】iPhoneのCoreデータをWebサーバーと同期し、他のデバイスにプッシュする方法は?[クローズド]
-
[解決済み】iOSがiPadを使用しているかどうかを検出する。
-
[解決済み】デバイスがiPhone Xであるかどうかを検出します。
-
[解決済み】iOS Swiftアプリの背景画像にグラデーションを適用する方法
-
[解決済み】Xcode 4 - 新規インストールしたMacintoshでプロファイルをプロビジョニングすると「Valid signing identity not found」エラーが発生する。
-
[解決済み] iPhoneのポートレートでUISplitViewControllerを使用すると、マスターではなく詳細VCが表示される
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 地名から座標へ 最短距離
-
[解決済み] プライベート・フレームワークとは何か、どのように活用するのか。
-
[解決済み] <Error> です。CGAffineTransformInvert: 非正規行列
-
アップルスマホの各種サイズとiPhone X、iPhone 11、iPhone 12、iPhone 13の画面適応、ステータスバーの高さ問題の詳細表
-
[解決済み】iPhoneのブラウザからlocalhostで動作するWebサイトにアクセスする方法
-
[解決済み】Corona、Phonegap、Titaniumの比較について
-
[解決済み】Xcodeの「ビルドとアーカイブ」メニューが無効になる件
-
[解決済み】iPhoneアプリでNSErrorを使用するにはどうすればよいですか?
-
[解決済み】Xcode 4がターゲットデバイス上で "finished running <my app>"と表示される -- 何も起こらない
-
[解決済み】YouTubeやMapsなど、iPhoneアプリのhttp+ドメインベースのURL Schemeを登録することは可能でしょうか?