web-dev-qa-db-ja.com

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

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

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

どうすればいいの?

299
Finn Gaida

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

IOSの auto-resizing 機能を使用すると、ビューを調整したり、任意の画面サイズに合わせたりできます。

それほど難しいことではありません、 some documentation を読んでください。それはあなたに多くの時間を節約するでしょう。

iOS 6もこれに関する新機能を提供します。
Apple Developer Webサイトの iOS 6 API changelog を必ず読んでください。
そして、新しいiOS 6 AutoLayout capabilitiesを確認してください。

それでも、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 )

H2CO3のコメントで指摘されているように、浮動小数点を比較するときにfabsをイプシロンと一緒に使用すると、精度エラーを防ぐことができます。

したがって、これからは標準の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の画面用に最適化されていないと([email protected]画像がない)、このマクロは機能しません。ケース。

最適化されていないアプリでiPhone 5を検出する理由がわからないため、これが問題になるとは思わない。

重要 - iOS 8のサポート

IOS 8では、boundsクラスのUIScreenプロパティは、 デバイスの向き を反映するようになりました。
つまり、前のコードはそのままでは機能しません。

これを修正するには、nativeBoundsの代わりに新しいboundsプロパティを使用することができます。これは向きによっては変化しないため、また縦長モードに基づいているためです。
nativeBoundsの寸法はピクセル単位で計測されているため、iPhone 5の場合、高さは568ではなく 1136 になります。

IOS 7以下もターゲットにしている場合は、iOS 8より前にnativeBoundsを呼び出すとアプリがクラッシュするため、必ず機能検出を使用してください。

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を検出する必要がある場合は、対応する画面サイズを使用してください。

466
Macmade

SDKとOSの任意の組み合わせに対してテストおよび設計されています。

迅速

iPadタイプを追加しました。 iPad 2とiPad miniは網膜外のiPadです。 iPad Mini 2以上、iPad 3、4、iPad Air、Air 2、Air 3、およびiPad Pro 9.7の論理解像度は同じ1024です。iPadProのmaxLengthは1366です。参考文献

import UIKit

public enum DisplayType {
    case unknown
    case iphone4
    case iphone5
    case iphone6
    case iphone6plus
    case iPadNonRetina
    case iPad
    case iPadProBig
    static let iphone7 = iphone6
    static let iphone7plus = iphone6plus
}

public final class Display {
    class var width:CGFloat { return UIScreen.main.bounds.size.width }
    class var height:CGFloat { return UIScreen.main.bounds.size.height }
    class var maxLength:CGFloat { return max(width, height) }
    class var minLength:CGFloat { return min(width, height) }
    class var zoomed:Bool { return UIScreen.main.nativeScale >= UIScreen.main.scale }
    class var retina:Bool { return UIScreen.main.scale >= 2.0 }
    class var phone:Bool { return UIDevice.current.userInterfaceIdiom == .phone }
    class var pad:Bool { return UIDevice.current.userInterfaceIdiom == .pad }
    class var carplay:Bool { return UIDevice.current.userInterfaceIdiom == .carPlay }
    class var tv:Bool { return UIDevice.current.userInterfaceIdiom == .tv }
    class var typeIsLike:DisplayType {
        if phone && maxLength < 568 {
            return .iphone4
        }
        else if phone && maxLength == 568 {
                return .iphone5
        }
        else if phone && maxLength == 667 {
            return .iphone6
        }
        else if phone && maxLength == 736 {
            return .iphone6plus
        }
        else if pad && !retina {
            return .iPadNonRetina
        }
        else if pad && retina && maxLength == 1024 {
            return .iPad
        }
        else if pad && maxLength == 1366 {
            return .iPadProBig
        }
        return .unknown
    }
}

実際に見る https://Gist.github.com/hfossli/bc93d924649de881ee2882457f14e346

注: iPhone 6はズームモードです。UIはiPhone 5を拡大したものです。これらの機能はデバイスタイプを決定するものではありませんが、表示モード、つまりiPhone 5はこの例では望ましい結果です。

Objective-C

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)

#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_ZOOMED (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)

用法: http://pastie.org/9687735

注: iPhone 6はズームモードです。UIはiPhone 5を拡大したものです。これらの機能はデバイスタイプを決定するものではありませんが、表示モード、つまりiPhone 5はこの例では望ましい結果です。

233
hfossli

本当に簡単な解決策

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    if(result.height == 568)
    {
        // iPhone 5
    }
}
69
Samrat Mazumdar

IPhone 6と6Plusの画面サイズを考慮する必要があります。これが更新された答えです。

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    //its iPhone. Find out which one?

    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    else if(result.height == 568)
    {
        // iPhone 5
    }
    else if(result.height == 667)
    {
        // iPhone 6
    }
   else if(result.height == 736)
    {
        // iPhone 6 Plus
    }
}
else
{
     //its iPad
}

いくつかの役に立つ情報

iPhone 6 Plus   736x414 points  2208x1242 pixels    3x scale    1920x1080 physical pixels   401 physical ppi    5.5"
iPhone 6        667x375 points  1334x750 pixels     2x scale    1334x750 physical pixels    326 physical ppi    4.7"
iPhone 5        568x320 points  1136x640 pixels     2x scale    1136x640 physical pixels    326 physical ppi    4.0"
iPhone 4        480x320 points  960x640 pixels      2x scale    960x640 physical pixels     326 physical ppi    3.5"
iPhone 3GS      480x320 points  480x320 pixels      1x scale    480x320 physical pixels     163 physical ppi    3.5"
27
Sam B

私は、MacmadeのマクロをCの関数に変換し、それがwidescreen availabilityNOT _は必ずiPhone 5を検出するので、それを正しく命名しました。

プロジェクトに[email protected]が含まれていない場合、マクロはiPhone 5での実行も検出しません。新しいデフォルト画像がないと、iPhone 5は通常の480 x 320の画面サイズ(ポイント単位)を報告します。そのため、このチェックはワイドスクリーンの可用性だけではなく、ワイドスクリーンモードが有効になっているについても同様です。

BOOL isWidescreenEnabled()
{
    return (BOOL)(fabs((double)[UIScreen mainScreen].bounds.size.height - 
                                               (double)568) < DBL_EPSILON);
}
15
LearnCocos2D

これは私たちのコードです、テストは、デバイスやエミュレータに関係なく、iphone4、iphone5、ipad、iphone 6、iphone 6のios7/ios8に渡されます。

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) // iPhone and       iPod touch style UI

#define IS_IPHONE_5_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0f)
#define IS_IPHONE_6_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0f)
#define IS_IPHONE_6P_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS7 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height < 568.0f)

#define IS_IPHONE_5_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 568.0f)
#define IS_IPHONE_6_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 667.0f)
#define IS_IPHONE_6P_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 736.0f)
#define IS_IPHONE_4_AND_OLDER_IOS8 (IS_IPHONE && ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) < 568.0f)

#define IS_IPHONE_5 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_5_IOS8 : IS_IPHONE_5_IOS7 )
#define IS_IPHONE_6 ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6_IOS8 : IS_IPHONE_6_IOS7 )
#define IS_IPHONE_6P ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_6P_IOS8 : IS_IPHONE_6P_IOS7 )
#define IS_IPHONE_4_AND_OLDER ( ( [ [ UIScreen mainScreen ] respondsToSelector: @selector( nativeBounds ) ] ) ? IS_IPHONE_4_AND_OLDER_IOS8 : IS_IPHONE_4_AND_OLDER_IOS7 )
11
Ginger

Hfossliの答えを使ってSwiftに翻訳した

let IS_IPAD = UIDevice.currentDevice().userInterfaceIdiom == .Pad
let IS_IPHONE = UIDevice.currentDevice().userInterfaceIdiom == .Phone
let IS_RETINA = UIScreen.mainScreen().scale >= 2.0

let SCREEN_WIDTH = UIScreen.mainScreen().bounds.size.width
let SCREEN_HEIGHT = UIScreen.mainScreen().bounds.size.height
let SCREEN_MAX_LENGTH = max(SCREEN_WIDTH, SCREEN_HEIGHT)
let SCREEN_MIN_LENGTH = min(SCREEN_WIDTH, SCREEN_HEIGHT)

let IS_IPHONE_4_OR_LESS = (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
let IS_IPHONE_5 = (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
let IS_IPHONE_6 = (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
let IS_IPHONE_6P = (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
7
Borbea

これは私のcocos2dプロジェクト用のマクロです。他のアプリでも同じでなければなりません。

#define WIDTH_IPAD 1024
#define WIDTH_IPHONE_5 568
#define WIDTH_IPHONE_4 480
#define HEIGHT_IPAD 768
#define HEIGHT_IPHONE 320

#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

//width is height!
#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_5 )
#define IS_IPHONE_4 ( [ [ UIScreen mainScreen ] bounds ].size.height == WIDTH_IPHONE_4 )

#define cp_ph4(__X__, __Y__) ccp(cx_ph4(__X__), cy_ph4(__Y__))
#define cx_ph4(__X__) (IS_IPAD ? (__X__ * WIDTH_IPAD / WIDTH_IPHONE_4) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPHONE_4) : (__X__)))
#define cy_ph4(__Y__) (IS_IPAD ? (__Y__ * HEIGHT_IPAD / HEIGHT_IPHONE) : (__Y__))

#define cp_pad(__X__, __Y__) ccp(cx_pad(__X__), cy_pad(__Y__))
#define cx_pad(__X__) (IS_IPAD ? (__X__) : (IS_IPHONE_5 ? (__X__ * WIDTH_IPHONE_5 / WIDTH_IPAD) : (__X__ * WIDTH_IPHONE_4 / WIDTH_IPAD)))
#define cy_pad(__Y__) (IS_IPAD ? (__Y__) : (__Y__ * HEIGHT_IPHONE / HEIGHT_IPAD))
6
OMGPOP
if ((int)[[UIScreen mainScreen] bounds].size.height == 568)
{
    // This is iPhone 5 screen
} else {
    // This is iPhone 4 screen
}
5
D-eptdeveloper

Swiftでは、iOS 8+プロジェクト私はUIScreenの拡張をするのが好きです。

extension UIScreen {

    var isPhone4: Bool {
        return self.nativeBounds.size.height == 960;
    }

    var isPhone5: Bool {
        return self.nativeBounds.size.height == 1136;
    }

    var isPhone6: Bool {
        return self.nativeBounds.size.height == 1334;
    }

    var isPhone6Plus: Bool {
        return self.nativeBounds.size.height == 2208;
    }

}

(注:nativeBoundsはピクセル単位です)。

そしてコードは次のようになります。

if UIScreen.mainScreen().isPhone4 {
    // do smth on the smallest screen
}

そのため、コードによって、これがメイン画面のチェックであり、デバイスモデルのチェックではないことが明らかになります。

3
zubko

Samrat Mazumdarの答えから借りて、ここでデバイスの画面サイズを推定する簡単な方法です。これは最新のデバイスでは動作しますが、将来のデバイスでは失敗する可能性があります(すべての推測方法で可能性があるため)。デバイスがミラーリングされている場合も混乱します(ミラーリングされたスクリーンサイズではなく、デバイスのスクリーンサイズを返します)。

#define SCREEN_SIZE_IPHONE_CLASSIC 3.5
#define SCREEN_SIZE_IPHONE_TALL 4.0
#define SCREEN_SIZE_IPAD_CLASSIC 9.7

+ (CGFloat)screenPhysicalSize
{
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        if (result.height < 500)
            return SCREEN_SIZE_IPHONE_CLASSIC;  // iPhone 4S / 4th Gen iPod Touch or earlier
        else
            return SCREEN_SIZE_IPHONE_TALL;  // iPhone 5
    }
    else
    {
        return SCREEN_SIZE_IPAD_CLASSIC; // iPad
    }
} 
2
Jeff Hay

私は答えがシミュレータのための特別なケースを含まないことがわかりました。

#define IS_WIDESCREEN ( [ [ UIScreen mainScreen ] bounds ].size.height == 568  )
#define IS_IPHONE ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPhone"].location != NSNotFound)
#define IS_IPAD ([[ [ UIDevice currentDevice ] model ] rangeOfString:@"iPad"].location != NSNotFound)
#define IS_IPHONE_5 ( IS_IPHONE && IS_WIDESCREEN )
2
valvoline
+(BOOL)isDeviceiPhone5
{
    BOOL iPhone5 = FALSE;

    CGRect screenBounds = [[UIScreen mainScreen] bounds];
    if (screenBounds.size.height == 568)
    {
        // code for 4-inch screen
        iPhone5 = TRUE;
    }
    else
    {
        iPhone5 = FALSE;
        // code for 3.5-inch screen
    }
    return iPhone5;

}
2
Mubin Shaikh

私はこのマクロがデバイスとシミュレータでうまくいくならば、それは良いはずだと思います、以下は解決策です。

#define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)
#define IS_IPHONE (([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"]) || ([[[UIDevice currentDevice] model] isEqualToString: @"iPhone Simulator"]))
#define IS_iPod   ([[[UIDevice currentDevice]model] isEqualToString:@"iPod touch"])
#define IS_IPHONE_5 ((IS_IPHONE || IS_iPod) && IS_WIDESCREEN)
2
Bhavesh Dhaduk
CGFloat height = [UIScreen mainScreen].bounds.size.height;

NSLog(@"screen soze is %f",height);

  if (height>550) {

          // 4" screen-do some thing
     }

  else if (height<500) {

        // 3.5 " screen- do some thing

     }
1
Nithin M Keloth
  1. 'New Swift File'を追加 - > AppDelegateEx.Swift

  2. AppDelegateに拡張子を追加する

    import UIKit
    extension AppDelegate {
         class func isIPhone5 () -> Bool{
             return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 568.0
        }
        class func isIPhone6 () -> Bool {
            return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 667.0
        }
        class func isIPhone6Plus () -> Bool {
            return max(UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height) == 736.0
        }  
    }
    
  3. 使用法:

        if AppDelegate.isIPhone5() {
            collectionViewTopConstraint.constant = 2
        }else if AppDelegate.isIPhone6() {
            collectionViewTopConstraint.constant = 20
        }
    
1
William Hu

これにより、デバイスファミリを検出できます。

    #import <sys/utsname.h>
    NSString* deviceName()
    {
        struct utsname systemInformation;
        uname(&systemInformation);
        NSString *result = [NSString stringWithCString:systemInformation.machine
                                              encoding:NSUTF8StringEncoding];
        return result;
    }

    #define isIPhone5  [deviceName() rangeOfString:@"iPhone5,"].location != NSNotFound
    #define isIPhone5S [deviceName() rangeOfString:@"iPhone6,"].location != NSNotFound
1
Xeieshan

Swift 3では、私の単純なクラスKRDeviceTypeを使うことができます。

https://github.com/ulian-onua/KRDeviceType

よく文書化されていて、演算子==、> =、<=をサポートしています。

たとえば、デバイスにiPhone 6/6s/7の境界があるかどうかを検出するには、次の比較を使用します。

if KRDeviceType() == .iPhone6 {
// Perform appropiate operations
}

デバイスにiPhone 5/5S/SE以前(iPhone 4s)の境界があるかどうかを検出するには、次の比較を使用できます。

if KRDeviceType() <= .iPhone5 {   //iPhone 5/5s/SE of iPhone 4s
// Perform appropiate operations (for example, set up constraints for those old devices)
}
1
Julian D.

サイズを頼りにすることは非常に多くのレベルで間違っています。システムに問い合わせてはどうですか。

- (NSString *) getDeviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}

から抜粋 ハードウェアの種類、iPhone4またはiPhone5を検出する最良の方法? 、edzio27回答。

1
3d0

プロジェクトがXcode 6を使用して作成されている場合は、下記のコードを使用してデバイスを検出します。

printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
    {
        if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
            printf("Device Type : iPhone 4,4s ");

        }else if([[UIScreen mainScreen] nativeBounds].size.height == 1136){
            printf("Device Type : iPhone 5,5S/iPod 5 ");

        }else if([[UIScreen mainScreen] nativeBounds].size.height == 1334){
            printf("Device Type : iPhone 6 ");

        }else if([[UIScreen mainScreen] nativeBounds].size.height == 2208){
            printf("Device Type : iPhone 6+ ");

        }
    }
}else{
    printf("Device Type : iPad");
}

プロジェクトがXcode 5で作成され、Xcode 6で開かれた場合は、下記のコードを使用してデバイスを検出します(このコードは、iPhone 6,6+用の起動画像が割り当てられていない場合は機能します)。 )

printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] nativeBounds].size.width,(int)[[UIScreen mainScreen] nativeBounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
    {
       if([[UIScreen mainScreen] nativeBounds].size.height == 960 || [[UIScreen mainScreen] nativeBounds].size.height == 480){
            printf("Device Type : iPhone 4,4s");
            appType=1;
        }else if([[UIScreen mainScreen] nativeBounds].size.height == 1136 || [[UIScreen mainScreen] nativeBounds].size.height == 1704){
            printf("Device Type : iPhone 5,5S,6,6S/iPod 5 ");
            appType=3;
        }
    }
}else{
    printf("Device Type : iPad");
    appType=2;
}

それでもXcode 5をすべて一緒に使用している場合は、次のコードを使用してデバイスを検出します(iPhone 6および6+は検出されません)

printf("\nDetected Resolution : %d x %d\n\n",(int)[[UIScreen mainScreen] bounds].size.width,(int)[[UIScreen mainScreen] bounds].size.height);
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
    if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        CGFloat scale = [UIScreen mainScreen].scale;
        result = CGSizeMake(result.width * scale, result.height * scale);
        if(result.height == 960 || result.height == 480){
            printf("Device Type : iPhone 4,4S ");

        }else if(result.height == 1136){
            printf("Device Type : iPhone 5s/iPod 5");

        }
    }
}else{
    printf("Device Type : iPad");

}
1
Aritra Das

これは100回答えられました、しかし、この解決策は私のために最もよく働きました。これは単純なヘルパー関数であり、システムクラスを拡張する必要はありません。

Swift 3 Helper:

func phoneSizeInInches(defaultValue: Float = 4.7) -> Float {
    switch (UIScreen.main.nativeBounds.size.height) {
    case 960, 480:
        return 3.5
    case 1136:
        return 4
    case 1334:
        return 4.7
    case 2208:
        return 5.5
    default:
        return defaultValue
    }
}

これは、 "5.5インチ"や "4.7インチ"などの携帯電話のインチサイズを記憶するのは簡単ですが、正確なピクセルサイズを覚えるのは難しいためです。

if phoneSizeInInches() == 4 {
  //do something with only 4 inch iPhones
}

これはまたあなたにこのようなことをする機会を与えます:

if phoneSizeInInches() < 5.5 {
  //do something all iPhones smaller than the plus
}

"defaultValue"を指定すると、Appleが新しいデバイスサイズをリリースしてもまだアプリを更新していない場合、コードは常に安全なサイズにフォールバックします。

if phoneSizeInInches(defaultValue: 4.7) == 4 {
    //if a new iPhone size is introduced, your code will default to behaving like a 4.7 inch iPhone
}

これは電話のアプリに特有のもので、普遍的なアプリのためにいくつかの変更が必要になるでしょう。

1
William T.

これは、向きに依存しない、デバイスの正しいテストです。

- (BOOL)isIPhone5
{
    CGSize size = [[UIScreen mainScreen] bounds].size;
    if (MIN(size.width,size.height) == 320 && MAX(size.width,size.height == 568)) {
        return YES;
    }
    return NO;
}
0
Pawel Molodkin

次のコードを使用してください。

CGFloat screenScale = [[UIScreen mainScreen] scale];

CGRect screenBounds = [[UIScreen mainScreen] bounds]; 

CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 

if (screenSize.height==1136.000000)
{ 
    // Here iPhone 5 View

    // Eg: Nextview~iPhone5.Xib
} else {
   // Previous Phones 

   // Eg : Nextview.xib
}
0
user1025285