質問:
僕のiOSアプリケーションは UINavigationBar
の高さ情報を使ってるんだけど、新しいiPhone Xだと問題が起こりそうなんだ。
誰かiPhone X上でアプリが実行されているかどうかを自動検出する信頼できる方法って知ってる(Objectiv-Cで)?
編集:
もちろん、画面のサイズをチェックすることは可能だけど、iOSを検出するために使うTARGET_OS_IPHONE
みたいなビルトイン・メソッドって無いかな、、、?
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize screenSize = [[UIScreen mainScreen] bounds].size; if (screenSize.height == 812) NSLog(@"iPhone X"); }
|
回答1:
答えから言うとNo、直接的に検出する方法はないよ。もっと詳細が知りたければこことか
ここを参照。
もしiPhoneの高さの検出を検出したいなら、2436pxを使うべき
デバイス画面のサイズと向き
Switft3以上
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 2208: print("iPhone 6+/6S+/7+/8+") case 2436: print("iPhone X") default: print("unknown") } }
|
Objective 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 2208: printf("iPhone 6+/6S+/7+/8+"); break; case 2436: printf("iPhone X"); break; default: printf("unknown"); } }
|
それかscreenSize.heightをint型の812
でなくfloat型の812.0f
として使用するとか
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize screenSize = [[UIScreen mainScreen] bounds].size; if (screenSize.height == 812.0f) NSLog(@"iPhone X"); }
|
詳細についてはこちら.
更新
デバイスタイプを識別するために userInterfaceIdiom
プロパティを使うべきじゃない。iPhoneアプリはiPadにもインストールできるので、その場合、userInterfaceIdiomはUIUserInterfaceIdiomPhoneを返してしまうから。
適切な方法は、 uname
を使ってマシン名を取得すること。このスレッドを参照してみて。
回答2:
もう一つの方法はこんなの。これは今のところiPhone Xだけが上部にノッチを持ったデバイスだから動くんだけど。
僕が使ってる方法は:
iphoneX = NO; if (@available(iOS 11.0, *)) { if (_window.safeAreaInsets.top > 0.0) { iphoneX = YES; } }
|
もちろん、横向きでの場合は左右のセーフエリアのインセットをチェックする必要があるかも。
編集:_windowはAppDelegateのUIWindowで、このチェックはアプリケーションdidFinishLaunchingWithOptionsの中で行われる。
By
saswanb | 回答日時: 2017年9月14日 19:50
回答3:
デバイスモデル/マシン名をチェックして。コードの中でポイントやピクセル数を使わないで!
それはハードコードだから!
#import <sys/utsname.h> // import it in your header or implementation file. NSString* deviceName() { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; }
|
結果:
@"iPhone10,3" on iPhone X (CDMA) @"iPhone10,6" on iPhone X (GSM)
|
この回答を参照。
By
Itachi | 回答日時: 2017年9月20日 7:51
Source: Detect if the device is iPhone X