iOSはユーザーがiPadを使用しているかどうかを検出します


260

私はiPhoneとiPod Touchで動作するアプリを持っています。それはRetina iPadとすべてで動作しますが、1つの調整が必要です。現在のデバイスがiPadかどうかを検出する必要があります。ユーザーが私の中UIViewControllerでiPadを使用しているかどうかを検出し、それに応じて何かを変更するには、どのコードを使用できますか?

回答:


589

デバイスがiPadかどうかを確認するには、いくつかの方法があります。これが、デバイスが実際にiPadであるかどうかを確認する私のお気に入りの方法です。

if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
{
    return YES; /* Device is iPad */
}

私の使い方

#define IDIOM    UI_USER_INTERFACE_IDIOM()
#define IPAD     UIUserInterfaceIdiomPad

if ( IDIOM == IPAD ) {
    /* do something specifically for iPad. */
} else {
    /* do something specifically for iPhone or iPod touch. */
}   

その他の例

if ( [(NSString*)[UIDevice currentDevice].model hasPrefix:@"iPad"] ) {
    return YES; /* Device is iPad */
}

#define IPAD     (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
if ( IPAD ) 
     return YES;

Swiftソリューションについては、この回答を参照してください:https : //stackoverflow.com/a/27517536/2057171


23
それを使用する方法は、それができるほど効率的ではありません。UI_USER_INTERFACE_IDIOM()と同等([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)です。結果をどこかにキャッシュする方がよい場合がありますBOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) …
Marcelo Cantos 2013

7
最後のメソッドではisEqualToStringではなくhasPrefixを使用します。このようにして、コードはシミュレータでも動作します。
elbuild 2013

18
スウィフト:if UIDevice.currentDevice().userInterfaceIdiom == .Pad
パン

2
マクロの見事な使用。コードを難読化する優れた方法。
gnasher729

2
@ gnasher729 500人以上があなたに反対する傾向があります。あなたはこれを行うためのより良い方法があると思うので、卑劣なコメントの代わりに、あなた自身の答えを提供してみませんか?
WrightsCS 2017

162

スウィフトあなたは決定するには、次の等式を使用することができ、デバイスの種類をユニバーサルアプリに:

UIDevice.current.userInterfaceIdiom == .phone
// or
UIDevice.current.userInterfaceIdiom == .pad

その場合、使用法は次のようになります。

if UIDevice.current.userInterfaceIdiom == .pad {
    // Available Idioms - .pad, .phone, .tv, .carPlay, .unspecified
    // Implement your logic here
}

3
回答へのリンクを承認済みの回答に編集しています。(この方法であなたもクレジットを取得します)。これは目的Cの質問ですが、この質問を表示する多くの人がGoogleから来ており、Swiftソリューションを探している可能性があります。:D
Albert Renshaw 14

1
ありがとう、@ AlbertRenshaw。私もそう思いました。:)ところで、質問の意図は具体的にはObjective-Cを求めることではなかったと思いますが、iOS(現時点ではObj-C)を対象としています。少なくとも私は、Swiftについてもこの質問の下で答えを見つけることを期待していました。
Jeehut 2014

こんにちは、@ sevensevens様、フィードバックをありがとうございます。私はこれを試してみましたが、シミュレータでiOS 9をターゲットとするXCode 7.2でうまくいきました。XCodeのどのバージョンを使用していますか?たぶんそれは古いXCodeでは動作しませんか?ドキュメントuserInterfaceIdiomは「iOS 3.2以降で利用可能」と言っています。それは問題ではないはずです。
Jeehut

または、iPadシミュレータでiPhone専用アプリを実行している可能性がありますか?その場合、それは混乱を説明しますが、実際のデバイスでもこのように動作するはずです。@Yunus Nedim Mehelが@Richardsのコメントで指摘しているように、状況はの.Phone代わりに返され.Padます。
Jeehut

すみません-シミュレーターをiPhoneに設定しました。お奨めは午前2時に変更を停止します
セブンセブン

35

これは、iOS 3.2以降のUIDeviceの一部です。例:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

4
一般的にイディオムの方が優れていますが、iPadでiPhoneアプリを実行している場合は、UIUserInterfaceIdiomPhoneが返されます。
Yunus Nedim Mehel、2013

25

これも使えます

#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
...
if (IPAD) {
   // iPad
} else {
   // iPhone / iPod Touch
}

24

UI_USER_INTERFACE_IDIOM()アプリがiPadまたはUniversal用の場合にのみiPadを返します。iPadで実行されているiPhoneアプリの場合は機能しません。したがって、代わりにモデルを確認する必要があります。


15

注意:アプリがiPhoneデバイスのみを対象にしている場合、iphone互換モードで実行されているiPadは、以下のステートメントに対してfalseを返します。

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

物理的なiPadデバイスを検出する正しい方法は次のとおりです。

#define IS_IPAD_DEVICE      ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])

15

Xcode内のシミュレータでは、一部のソリューションが機能しないことがわかりました。代わりに、これは機能します:

ObjC

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([[deviceModel substringWithRange:NSMakeRange(0, 4)] isEqualToString:@"iPad"]) {
    DebugLog(@"iPad");
} else {
    DebugLog(@"iPhone or iPod Touch");
}

迅速

if UIDevice.current.model.hasPrefix("iPad") {
    print("iPad")
} else {
    print("iPhone or iPod Touch")
}

また、Xcodeの「その他の例」では、デバイスモデルが「iPadシミュレーター」として返されるため、上記の微調整で整理する必要があります。


たぶん、Appleはシミュレータを更新して、「iPadシミュレータ」や「iPad 2.1」などのように言っています... hasSuffix:@"iPad"代わりに使用できる場合isEqualToString@"iPad"...最善の策は、シミュレータが返すデバイスモデルをログに記録することですそこから...
Albert Renshaw

8

Swiftでそれを行う多くの方法:

以下のモデルを確認します(ここでは大文字と小文字を区別した検索のみを実行できます)。

class func isUserUsingAnIpad() -> Bool {
    let deviceModel = UIDevice.currentDevice().model
    let result: Bool = NSString(string: deviceModel).containsString("iPad")
    return result
}

以下のモデルをチェックします(ここでは大文字と小文字を区別する/区別しない検索を実行できます)。

    class func isUserUsingAnIpad() -> Bool {
        let deviceModel = UIDevice.currentDevice().model
        let deviceModelNumberOfCharacters: Int = count(deviceModel)
        if deviceModel.rangeOfString("iPad",
                                     options: NSStringCompareOptions.LiteralSearch,
                                     range: Range<String.Index>(start: deviceModel.startIndex,
                                                                end: advance(deviceModel.startIndex, deviceModelNumberOfCharacters)),
                                     locale: nil) != nil {
            return true
        } else {
            return false
        }
   }

UIDevice.currentDevice().userInterfaceIdiom以下は、アプリがiPadまたはUniversal用の場合にのみiPadを返します。iPadで実行されているiPhoneアプリの場合は、実行されません。したがって、代わりにモデルを確認する必要があります。:

    class func isUserUsingAnIpad() -> Bool {
        if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad {
            return true
        } else {
            return false
        }
   }

以下のスニペットは、クラスがを継承しない場合はコンパイルされませんUIViewController。それ以外の場合は正常に動作します。いずれにしてUI_USER_INTERFACE_IDIOM()も、アプリがiPadまたはUniversal用の場合にのみiPadを返します。iPadで実行されているiPhoneアプリの場合は、実行されません。したがって、代わりにモデルを確認する必要があります。:

class func isUserUsingAnIpad() -> Bool {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
        return true
    } else {
        return false
    }
}

2
Objective-Cとタグ付けされた質問への古い回答をすばやく書き直す必要はないと思います。
クリスチャンシュノール2015

4
最初にすべての回答がスタックオーバーフローに散らばっているので、私の回答は役に立ちます。次に、古いバージョンのiOSで機能していたものがiOS 8以降では正しく機能しないことがあります。したがって、私はこれらのソリューションをテストしましたが、この答えは非常に役立つ可能性があります。だから私はあなたに全く同意しません。
King-Wizard

さらに、Swiftでは構文が異なります。そのため、答えをインテリジェントにコピーして、特定の最新情報を理解することは、誰にとっても常に役立ちます。
King-Wizard


8

*

Swift 3.0では

*

 if UIDevice.current.userInterfaceIdiom == .pad {
        //pad
    } else if UIDevice.current.userInterfaceIdiom == .phone {
        //phone
    } else if UIDevice.current.userInterfaceIdiom == .tv {
        //tv
    } else if UIDevice.current.userInterfaceIdiom == .carPlay {
        //CarDisplay
    } else {
        //unspecified
    }

8

多くの答えは良いですが、私はこのように迅速に使用します4

  1. 定数を作成

    struct App {
        static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
    }
  2. このように使う

    if App.isRunningOnIpad {
        return load(from: .main, identifier: identifier)
    } else {
        return load(from: .ipad, identifier: identifier)
    }

編集: 推奨通り、UIDeviceに拡張機能を作成するだけです

extension UIDevice {
    static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}

3
拡張機能でApp同じことができるのに、なぜ構造体に悩まされるのUIDeviceでしょうか。
クール2018

3

rangeOfStringをチェックして、iPadがこのように存在するという単語を確認できます。

NSString *deviceModel = (NSString*)[UIDevice currentDevice].model;

if ([deviceModel rangeOfString:@"iPad"].location != NSNotFound)  {
NSLog(@"I am an iPad");
} else {
NSLog(@"I am not an iPad");
}

["I am not an iPad" rangeOfString:@"iPad"].location != NSNotFoundtrueを返します。
クール2018

2

さらにもう1つの方法:

//MARK: -  Device Check
let iPad = UIUserInterfaceIdiom.Pad
let iPhone = UIUserInterfaceIdiom.Phone
@available(iOS 9.0, *) /* AppleTV check is iOS9+ */
let TV = UIUserInterfaceIdiom.TV

extension UIDevice {
    static var type: UIUserInterfaceIdiom 
        { return UIDevice.currentDevice().userInterfaceIdiom }
}

使用法:

if UIDevice.type == iPhone {
    //it's an iPhone!
}

if UIDevice.type == iPad {
    //it's an iPad!
}

if UIDevice.type == TV {
    //it's an TV!
}

2

スウィフト4.2とXcode 10

if UIDevice().userInterfaceIdiom == .phone {
    //This is iPhone
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
} else if UIDevice().userInterfaceIdiom == .tv {
    //This is Apple TV
}

特定のデバイスを検出したい場合

let screenHeight = UIScreen.main.bounds.size.height
if UIDevice().userInterfaceIdiom == .phone {
    if (screenHeight >= 667) {
        print("iPhone 6 and later")
    } else if (screenHeight == 568) {
        print("SE, 5C, 5S")
    } else if(screenHeight<=480){
        print("4S")
    }
} else if UIDevice().userInterfaceIdiom == .pad { 
    //This is iPad
}

1

なぜそんなに複雑なのですか?これが私のやり方です...

スウィフト4:

var iPad : Bool {
    return UIDevice.current.model.contains("iPad")
}

このようにあなたはただ言うことができます if iPad {}


1
注:この質問は2012年に尋ねられました
Albert Renshaw

0

iOSの最新バージョンについては、単に追加してUITraitCollectionください:

extension UITraitCollection {

    var isIpad: Bool {
        return horizontalSizeClass == .regular && verticalSizeClass == .regular
    }
}

そして、UIViewControllerチェックだけで:

if traitCollection.isIpad { ... }

4
iPad-Appが分割画面モードのときにも機能しますか?次に、水平サイズのクラスはコンパクトになります。
オリバー

0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.