iPhone 5(ワイドスクリーンデバイス)を検出する方法


300

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

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

どうすればいいですか?


2
すべての「ウィンドウ」を2回作成する必要はありません。画面サイズと正確に一致するはずのものだけを再レイアウトする必要があります。解決策はかなり明白なようです。ウィンドウのサイズを確認し、返されたサイズに基づいてケースの決定を追加します。
まで

1
まあ、基本的にはそうですが、横長の画面と同じように、追加の画面サイズをまったく別の方法で使用したいと思います。
Finn Gaida 2012

このURLをチェックしてください: stackoverflow.com/questions/4779221/...
ios_av

この質問は新しいデバイスに合わせて更新する必要がありますか?例:「画面サイズでiOSデバイスを検出する方法」?
hfossli 2014年

これを確認してくださいgithub.com/aleemrazzaq/ARCompactDeviceInfo
Aleem

回答:


467

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

自動サイズ変更を使用するiOS機能を、ビューを調整し、任意の画面サイズに適応させることができます。

それはそれほど難しくありません、いくつかのドキュメントを読んでください。それ。それはあなたに多くの時間を節約します。

iOS 6には、これに関する新機能も用意されています。Apple Developer WebサイトのiOS 6 API変更ログ
必ずお読みください。 そして、新しいiOS 6 AutoLayout機能を確認してください。

そうは言っても、本当に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 )

の用法 fabsH2CO3のコメントで指摘されているように、浮動小数点を比較するときに、イプシロンをと、精度エラーを防止できます。

したがって、今後は標準の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画面用に最適化されていない場合(Default-568h@2x.png画像がない場合)、このマクロは機能しないことに注意してください。ケース。

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

重要-iOS 8のサポート

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

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

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

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


7
これは間違っています。使用する必要があります#define IS_IPHONE_5 ( [ [ UIScreen mainScreen ] bounds ].size.height == 568 )
Fabian Kreiser、

28
@ H2CO3:への比較DBL_EPSILONはここでは不要であり、==比較は失敗しないことに注意してください。浮動小数点値を正確な数値として表現できない場合(1.0/3.0*3.0たとえば)、この方法で差分を使用して比較する必要があるだけです。詳細はこの記事を読んでください;)
AliSoftware

2
この答えは正しくありません。なぜそんなに多くの親指を立てたのですか?高さのみを使用してワイドスクリーンかどうかを判断することはできません。男...
OMGPOP 2012

5
追加できます:これをシミュレータで動作させる場合は、次を使用してください:#define IS_IPHONE(([[[UIDevice currentDevice] model] isEqualToString:@ "iPhone"])||([[[[UIDevice currentDevice] model] isEqualToString: @ "iPhone Simulator"]))
david

31
この答えは狂気です。これらの特定の種類の浮動小数点数(実際には、Appleは常に整数であることを知っている必要があることを知っている場合)を==と比較しないことをお勧めします。これは意味がなく、複雑すぎます。また、iPhoneの検出にはUI_USER_INTERFACE_IDIOM()を使用することをお勧めします。これは、デバイスとシミュレータの両方で正常に機能するためです(UIDeviceのアプローチよりも高速かもしれません)。これは正常に機能し、読み方も簡単です。#define IS_IPHONE5(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone && [UIScreen mainScreen] .bounds.size.height == 568)
Ricardo Sanchez-Saez

232

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

迅速

iPadタイプを追加しました。iPad 2とiPad miniはRetina以外のiPadです。上記のiPadミニ2&ながら、アプリ3、4、iPadの空気、エア2、エアー3、およびiPadは9.7が1024のiPad Proは1366のmaxLengthの有する同一の論理解像度有するプロ リファレンス

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が望ましい結果です。


1
iPhone 5は、新しいデフォルト画像なしで、通常の480x320画面サイズを報告します。私にとってこれは欲求行動です。
hfossli

3
おそらく有用な追加機能は#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)、iPhone4とiPhone5の両方とiPad Retinaと非Retinaの違いを判別するのに役立ちます
bshirley

1
同意しません。「ワイドスクリーン」の用語はすぐに時代遅れになるため、除外する必要があると思います。
hfossli 2014

1
@DvoleがiOS 8の動作です。SCREEN_MAX_LENGTHiPhone 5ですべての回転で568を取得するために使用します
hfossli

1
@MattParkinsより堅牢なモデルチェックを使用することをお勧めしますstackoverflow.com/questions/13366976/…
hfossli 2014年

69

本当にシンプルなソリューション

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

1
ハハ短くてシンペル、同じことをした:)オーバーヘッドを低く保つために強く打つ!マクロ
benjamin.ludwig

2
まあ、マクロや関数に物事を入れないことは、DRYにならない傾向があります...このチェックを複数回実行する必要がある瞬間から
hfossli

うん、でも上に示したようにマクロを定義する方が便利で簡単です。毎回これを貼り付ける必要はありません...
Resty

ありがとう、あなたは私の命を救った:Dが、なぜかわからないMacro:#define IS_IPHONE_5(IS_IPHONE && [[UIScreen mainScreen] bounds] .size.height == 568.0)==>以前はiOS iOS 7.1で動作していませんでした私はまだXCode 4.6に取り組んでいます。OMG iOS 7.1およびXcode 5
Linh Nguyen 14

iPhone 6および6と画面サイズに対応するために以下の回答を更新
Sam B

28

ここで、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"

それは:)私は風景の中にいますああ、私はそれを得たすべての私は、幅と高さを変更する必要がありますで決めていなかったiPhone 5私のために働く4 iPhone 6+として決定していないだけである
コールドスチール

アプリが横向きモードの場合は、result.heightをresult.widthに変更してください
Sam B

hmm .. iPhone 4(iOS 6.0)ではスワップされませんでした:(iOS 6.0の可能性がありますか、iPhone 4ですか?
ColdSteel

iOS 8以降でのみビューがスワップされることを確認しました
ColdSteel

高さ= 568を与えるiPhone 6
MaxEcho

15

私はCの関数にMacmadeでマクロを入れて、それが検出されるため、正しくそれに名前を付けるために自由を撮影したワイドスクリーンの可用性をしてないで、必ずしもiPhone 5。

プロジェクトにDefault-568h@2x.pngが含まれていない場合、マクロはiPhone 5での実行も検出しません。新しいデフォルト画像がない場合、iPhone 5は通常の480x320画面サイズ(ポイント単位)を報告します。したがって、このチェックはワイドスクリーンの可用性だけでなく、ワイドスクリーンモードが有効になっいることも確認します。

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

パフォーマンス上の理由から、私はまだマクロを好みます。私の回答の編集をご覧ください。また、モデルをチェックします。
Macmade 2012

1
また、iPhone 5は通常の480x320の画面サイズを報告し、新しいデフォルトの画像は表示されないと言っているのも正しいでしょう。しかし、最適化されていないアプリでiPhone 5を検出しても意味がないと思います。:)
Macmade 2012

@Macmade確かに意味はありませんが、検出が機能しない場合に備えて覚えておくとよいでしょう。また、関数をinlined にすることができます。また、コンパイラーのオプティマイザーがそれが良いアイデアであると判断した場合、およびそれが許容できることを確認できる場合(関数が同じモジュール内にある場合など)もインライン化されます。このようなものを関数で実装すると、追加の型チェックが行われる場合があります。
IvanVučica2012

4
パフォーマンスに関連する質問は、レンダリングループ中になぜこのチェックを数千回実行するのでしょうか。それ以外の場合、パフォーマンスは問題ではなく、明確であり、より重要な副作用を回避します。
LearnCocos2D 2012年

マクロではなく別の関数が好きなので、+ 1を与えましたが、実際には正しくないか、完全ではないことを指摘する必要があります。ワイドスクリーンを検出するには、画面の高さを見ないでください。代わりに、アスペクト比を確認し、アスペクト比が16:9以上の場合にのみtrueを返します。
トッドリーマン2013年

11

以下は、デバイスやシミュレーターに関係なく、iphone4、iphone5、ipad、iphone6、iphone6pの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 )

iPhone 6Pでテストしていますが、ifステートメントがIS_IPHONE_5状態になりますか?これはどのようにできるのですか、あなたはコードがよさそうだと思いますか?私は単純なif / elseで直接コピーして貼り付けましたが、私の電話はiOS 8.3を実行している6プラスです。
whyoz

7

私は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)

6

これは私の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))

5
if ((int)[[UIScreen mainScreen] bounds].size.height == 568)
{
    // This is iPhone 5 screen
} else {
    // This is iPhone 4 screen
}

3

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
}

したがって、コードは、これがデバイスモデルではなくメイン画面のチェックであることを明確にします。


2

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
    }
} 

iPad miniの修正が必要です。この邸宅で判断することはできません。
Daniel

ええ、iPad miniの解像度はiPad2と同じなので、この方法は使えません。わからない...今、その場合の処理方法
ジェフ・ヘイ

1
あなたはそうではありません。「iPad 2,5」のデバイス識別子を確認できます。また、2,6と2,7を確認する必要があります-wifi専用バージョン、gsmおよびCDMA。しかし、それは次のiPad miniがリリースされることを意味し、事前に知ることができない識別子にもハードコードに更新する必要があります。iPad miniをいつ使用しているのかを常に知ることはできません。小さい画面に「最適化」しようとするべきではないからです
Daniel

2

このマクロがデバイスとシミュレータで機能するのであれば良いと思います。解決策を以下に示します。

#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

回答にはシミュレータの特別なケースが含まれていないことがわかりました。

#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
+(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;

}

iPhone5 = FALSE;変更されていない場合、変数はすでにその値を持っているので不要です
mcont

1
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

このようにして、デバイスファミリを検出できます。

    #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

プロジェクトが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
  1. 「新しいSwiftファイル」を追加します-> 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

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

これは100回回答されていますが、このソリューションは私にとって最も効果的で、新しいデバイスが導入され、サイズが定義されていない場合の問題の解決に役立ちました。

Swift 5ヘルパー:

extension UIScreen {
    func phoneSizeInInches() -> CGFloat {
        switch (self.nativeBounds.size.height) {
        case 960, 480:
            return 3.5  //iPhone 4
        case 1136:
            return 4    //iPhone 5
        case 1334:
            return 4.7  //iPhone 6
        case 2208:
            return 5.5  //iPhone 6 Plus
        case 2436:
            return 5.8  //iPhone X
        case 1792:
            return 5.5  //iPhone XR
        case 2688:
            return 6.5  //iPhone XS Max
        default:
            let scale = self.scale
            let ppi = scale * 163
            let width = self.bounds.size.width * scale
            let height = self.bounds.size.height * scale
            let horizontal = width / ppi, vertical = height / ppi
            let diagonal = sqrt(pow(horizontal, 2) + pow(vertical, 2))
            return diagonal
        }
    }
}

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

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

これにより、次のようなこともできるようになります。

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

デフォルトは:用途にしようとすると、対角インチを計算するための画面サイズとスケールをしようとします。これは、いくつかの新しいデバイスサイズが表示された場合に備えて、最後の例などのコードが引き続き機能するかどうかを判断するために最善を尽くします。


0

次のコードを使用します。

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

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

- (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;
}

-2

すべてのバージョンのiPhoneおよびiPadデバイスを検出するために使用されます。

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0) 

iPhone 6にはRetinaディスプレイがありませんか?
vikingosegundo 2014

iPhone6には、ラティーナ(@ 2X)ディスプレイが搭載されています。iPhone6 plusにはHD(@ 3X)ディスプレイが搭載されています。
Vaibhav Sharma 2014

ではIS_RETINA、iPhone 6 plusでテストすると、1xコードが実行されますか?
vikingosegundo 2014年

このリンクを参照してください。 stackoverflow.com/questions/25756589/…–
Vaibhav Sharma

1
あなたはそれを取得しません:あなたのルールはを生み出すでしょう@1x、どこでそれが生み出すべきか@3x。とにかく:コピーして貼り付けるだけなので:-1
vikingosegundo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.