[解決済み】デバイスがiPhone Xであるかどうかを検出します。
質問
私のiOSアプリでは
UINavigationBar
を使用すると、新しい iPhone X でいくつかの問題が発生します。
どなたか既にご存知の方はいらっしゃいますか? 信頼できる アプリがiPhone Xで動作しているかどうかをプログラム的に(Objective-Cで)検出できますか?
EDITです。
もちろん、画面の大きさをチェックすることは可能ですが、次のようなビルドイン方式はないでしょうか。
TARGET_OS_IPHONE
iOSを検出するために...
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
if (screenSize.height == 812)
NSLog(@"iPhone X");
}
EDIT 2:
私の質問は、リンク先の質問と重複しているとは思いません。もちろん、現在のデバイスのさまざまなプロパティを測定し、その結果を使用してどのデバイスを使用するかを決定する方法は存在します。しかし、これは、私が最初の編集で強調しようとしたように、私の質問の実際のポイントではありません。
実際の質問は 現在のデバイスがiPhone Xであるかどうかを直接検出することは可能ですか(SDKの機能などによる)、それとも間接的な測定値を使用しなければなりませんか" ?
これまでの回答から推測すると、「直接的な方法はない」ということでしょう。測定が必要です"。
どのように解決するのですか?
ご質問の内容からすると、答えは「ノー」です。直接的な方法はありません。詳しくは、こちらで情報を得ることができます。
と
iPhone Xの縦幅は2436pxです
から デバイスの画面サイズと解像度 :
から デバイスの画面サイズと向き :
Swift 3 以降 :
if UIDevice().userInterfaceIdiom == .phone {
switch UIScreen.main.nativeBounds.height {
case 1136:
print("iPhone 5 or 5S or 5C")
case 1334:
print("iPhone 6/6S/7/8")
case 1920, 2208:
print("iPhone 6+/6S+/7+/8+")
case 2436:
print("iPhone X/XS/11 Pro")
case 2688:
print("iPhone XS Max/11 Pro Max")
case 1792:
print("iPhone XR/ 11 ")
default:
print("Unknown")
}
}
オブジェクティブC :
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
switch ((int)[[UIScreen mainScreen] nativeBounds].size.height) {
case 1136:
printf("iPhone 5 or 5S or 5C");
break;
case 1334:
printf("iPhone 6/6S/7/8");
break;
case 1920:
case 2208:
printf("iPhone 6+/6S+/7+/8+");
break;
case 2436:
printf("iPhone X/XS/11 Pro");
break;
case 2688:
printf("iPhone XS Max/11 Pro Max");
break;
case 1792:
printf("iPhone XR/ 11 ");
break;
default:
printf("Unknown");
break;
}
}
Xamarin.iOS :
if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone) {
if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1136) {
Console.WriteLine("iPhone 5 or 5S or 5C");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1334) {
Console.WriteLine("iPhone 6/6S/7/8");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1920 || (UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2208) {
Console.WriteLine("iPhone 6+/6S+/7+/8+");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2436) {
Console.WriteLine("iPhone X, XS, 11 Pro");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 2688) {
Console.WriteLine("iPhone XS Max, 11 Pro Max");
} else if ((UIScreen.MainScreen.Bounds.Height * UIScreen.MainScreen.Scale) == 1792) {
Console.WriteLine("iPhone XR, 11");
} else {
Console.WriteLine("Unknown");
}
}
ご質問の件ですが、以下の通りです。
または
screenSize.height
フロートとして
812.0f
not int
812
.
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
// 812.0 on iPhone X, XS
// 896.0 on iPhone XS Max, XR.
if (screenSize.height >= 812.0f)
NSLog(@"iPhone X");
}
詳しくは、iOS Human Interface Guidelinesの以下のページを参照してください。
スウィフト :
で検出する。
topNotch
:
iPhoneXを検出するためにノッチを使用することを検討している人は、quot;landscape"でそのすべてのiPhoneのために同じであることを注意してください。
var hasTopNotch: Bool {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.safeAreaInsets.top ?? 0 > 20
}else{
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
}
return false
}
オブジェクティブC :
- (BOOL)hasTopNotch {
if (@available(iOS 13.0, *)) {
return [self keyWindow].safeAreaInsets.top > 20.0;
}else{
return [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.top > 20.0;
}
return NO;
}
- (UIWindow*)keyWindow {
UIWindow *foundWindow = nil;
NSArray *windows = [[UIApplication sharedApplication]windows];
for (UIWindow *window in windows) {
if (window.isKeyWindow) {
foundWindow = window;
break;
}
}
return foundWindow;
}
アップデイト :
を使用しないでください。
userInterfaceIdiom
プロパティは、デバイスの種類を識別するために
userInterfaceIdiomのドキュメント
を説明します。
ユニバーサル・アプリケーションでは、このプロパティを使用して、アプリケーションの動作を特定の種類のデバイス用に調整することができます。例えば、iPhoneとiPadでは画面サイズが異なるため、現在のデバイスの種類に応じて、異なるビューやコントロールを作成することができます。
つまり、このプロパティは、実行中のアプリのビュースタイルを識別するために使われているだけなのです。しかし、iPhoneアプリ(ユニバーサルではない)をApp store経由でiPadデバイスにインストールすることも可能で、その場合は
userInterfaceIdiom
が返されます。
UIUserInterfaceIdiomPhone
も、そうです。
正しい方法は、マシン名を
uname
. 詳しくは以下をご確認ください。
関連
-
[解決済み】arm64アーキテクチャの未定義シンボルについて
-
[解決済み】iOS用のプライベートメッセージUI(受信、送信、作成)フレームワークはありますか?
-
[解決済み] Xcode は、[バンドル ID] に一致する iOS App Store プロビジョニングプロファイルを見つけられませんでした。
-
[解決済み] 「シミュレータで実行すると、「インストールされているプロビジョニングプロファイルが、インストールされているiOS署名アイデンティティと一致しません。
-
[解決済み] UTF-8でエンコードされたNSDataをNSStringに変換します。
-
[解決済み] ERROR ITMS-9000: "Redundant Binary Upload. 列車 '1.0' のビルドバージョン '1.0' のバイナリアップロードが既に存在します" と表示されました。
-
[解決済み] Xcodeで実行ファイルが無効なエンタイトルメントで署名されてしまう
-
[解決済み] 起動画面にカスタムクラス名が設定されない場合がある
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Xcode は、[バンドル ID] に一致する iOS App Store プロビジョニングプロファイルを見つけられませんでした。
-
[解決済み] Xcode 10でコマンドCompileSwiftが0以外の終了コードで失敗する [重複] 。
-
[解決済み] EXC_CORPSE_NOTIFY シンボルのクラッシュが発生しました、追跡するには?
-
[解決済み] iOS Development 証明書が失効されました
-
[解決済み] UICollectionView: 非Nilのレイアウトパラメータで初期化する必要があります。
-
[解決済み] ブリッジングヘッダ用のプリコンパイルヘッダの発行に失敗しました。
-
[解決済み] SwiftでUIColor patternImageを使用して画像を中心からタイル状に配置する方法
-
[解決済み] viewDidLoad()は何のためにあるのですか?[重複]する
-
[解決済み] アプリケーションは、アプリケーション起動の最後にルートビューコントローラーを持つことが期待される
-
[解決済み] ナビゲーションアイテムのタイトルカラーを変更する方法