iOS检测用户是否在iPad上


260

我有一个可以在iPhone和iPod Touch上运行的应用程序,可以在Retina iPad上运行,但所有其他操作都需要进行一次调整。我需要检测当前设备是否是iPad。我可以使用什么代码检测用户是否正在使用iPad UIViewController,然后进行相应更改?

Answers:


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) …
马塞洛·坎托斯

7
我将在您的最后一个方法中使用hasPrefix而不是isEqualToString。这样,代码也可以在模拟器上运行。
elbuild

18
斯威夫特:if UIDevice.currentDevice().userInterfaceIdiom == .Pad

2
Godawful使用宏。混淆代码的好方法。
gnasher729

2
@ gnasher729 500多个人倾向于不同意你。为何您不提供自己的答案,而不是the昧的评论,因为您认为自己有更好的方法。
WrightsCS '17

162

Swift中,您可以使用以下等式确定通用应用程序上的设备类型

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
我正在将指向您答案的链接编辑为接受的答案。(这样您也可以获得信誉)。即使这是一个Objective-C问题,也有很多查看此问题的人来自Google,并且可能正在寻找Swift解决方案!:D
艾伯特·伦肖2014年

1
谢谢@AlbertRenshaw。我也这样认为。:)顺便说一句:我认为问题的目的不是要针对Objective-C,而是针对iOS(当时是Obj-C)。至少我也希望在Swift的这个问题下找到答案。
Jeehut 2014年

嗨,@ sevensevens,谢谢您的反馈。我只是尝试了一下,它在针对模拟器中iOS 9的XCode 7.2中为我工作了。您正在使用哪个版本的XCode?也许它不适用于较旧的XCodes?文档说userInterfaceIdiom“在iOS 3.2及更高版本中可用”。所以那不应该是问题。
Jeehut 2015年

还是您在iPad模拟器上运行的是仅iPhone的应用程序?在那种情况下,这可以解释这种困惑-但我认为它也应该在真实设备上以这种方式表现。正如@Yunus Nedim Mehel在@Richards的评论中指出的那样,这种情况将.Phone取代,而返回.Pad
Jeehut 2015年

抱歉-将模拟器设置为iPhone。一定不要在凌晨2点进行更改
七点七分,2015年

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。如果它的iPhone应用程序在iPad上运行,则不会。因此,您应该检查模型。


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的Simulator中某些解决方案对我不起作用。相反,这可以工作:

对象

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 Simulator”的形式返回,因此上述调整应予以解决。


也许Apple更新了模拟器,说出了“ iPad模拟器”或“ iPad 2.1”之类的字眼……如果是这种情况,您可以使用... hasSuffix:@"iPad"代替,isEqualToString@"iPad"最好的选择是记录模拟器确实返回并运行的设备模型从那里...
Albert Renshaw 2012年

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或通用返回的iPad。如果它是在iPad上运行的iPhone应用程序,则不会。因此,您应该检查模型。:

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

2
我认为没有必要重写标有Objective-C的问题的旧答案。
Christian Schnorr,2015年

4
我绝对认为我的答案很有用,因为首先所有答案都分散在堆栈溢出中。其次,有时无法在iOS 8及更高版本上正常使用旧版本的iOS。因此,我测试了这些解决方案,此答案可能非常有用。所以我完全不同意你的看法。
King-Wizard

最重要的是,Swift中的语法是不同的。因此,对每个人进行答案的智能复制粘贴并了解具体的最新螺母和螺栓总是有用的。
King-Wizard


8

*

在迅速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)
    }

编辑: 按照建议,Cur仅在UIDevice上创建扩展

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

3
App当您可以对UIDevice扩展进行相同的操作时,为什么还要对结构感到困扰呢?
心教堂

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 != NSNotFound返回true。
心教堂

2

另一种快速方式:

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

Swift 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处于分屏模式时,这是否也起作用?这样,水平尺寸类别将变得紧凑。
奥利弗(Oliver)

0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.