281

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

4

17 回答 17

604

有很多方法可以检查设备是否是 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

于 2012-04-15T23:57:04.767 回答
184

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
}
于 2014-12-17T02:41:56.950 回答
35

这是 iOS 3.2 的 UIDevice 的一部分,例如:

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad
于 2012-11-22T13:16:34.557 回答
25

你也可以使用这个

#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
...
if (IPAD) {
   // iPad
} else {
   // iPhone / iPod Touch
}
于 2013-01-28T13:39:42.773 回答
24

UI_USER_INTERFACE_IDIOM()仅当应用程序适用于 iPad 或 Universal 时才返回 iPad。如果它是在 iPad 上运行的 iPhone 应用程序,那么它不会。所以你应该检查模型。

于 2014-01-27T21:06:09.807 回答
16

我发现某些解决方案在 Xcode 的模拟器中对我不起作用。相反,这有效:

对象

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 模拟器”,因此上述调整应该可以解决这个问题。

于 2012-11-14T11:02:12.187 回答
16

请注意:如果您的应用程序仅针对 iPhone 设备,则以 iphone 兼容模式运行的 iPad 将针对以下语句返回 false:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

检测物理 iPad 设备的正确方法是:

#define IS_IPAD_DEVICE      ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])
于 2015-06-12T07:41:40.700 回答
10

很多答案都很好,但我在 swift 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)
    }
    

编辑: 正如建议的 Cœur 只需在 UIDevice 上创建一个扩展

extension UIDevice {
    static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}
于 2018-01-04T13:44:54.017 回答
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
        }
   }

如果该类不继承 an ,则下面的此代码段不会编译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
    }
}
于 2015-06-02T18:03:13.847 回答
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
    }
于 2016-10-09T03:22:08.040 回答
4

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
}
于 2018-10-12T11:09:01.460 回答
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");
}
于 2014-09-03T02:42:57.430 回答
2

另一种 Swifty 方式:

//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!
}
于 2016-07-05T07:46:43.863 回答
2

为什么这么复杂?我就是这样做的...

斯威夫特 4:

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

这样你就可以说if iPad {}

于 2017-09-20T22:05:00.570 回答
1

我认为这些答案中的任何一个都不能满足我的需要,除非我从根本上误解了某些东西。

我有一个应用程序(最初是一个 iPad 应用程序),我想在 Catalyst 下在 iPad 和 Mac 上运行。我正在使用 plist 选项来扩展 Mac 界面以匹配 iPad,但如果这是合理的,我想迁移到 AppKit。在 Mac 上运行时,我相信所有上述方法都告诉我我在 iPad 上。Catalyst 的伪造非常彻底。

对于大多数问题,我确实理解代码应该在 Mac 上运行时假装它在 iPad 上。一个例外是滚动选择器在 Mac 上的 Catalyst 下不可用,但在 iPad 上可用。我想弄清楚是在运行时创建 UIPickerView 还是做一些不同的事情。运行时选择至关重要,因为从长远来看,我想使用一个二进制文件在 iPad 和 Mac 上运行,同时充分利用每个支持的 UI 标准。

这些 API 会给不经意的催化剂前读者带来潜在的误导性结果。例如,在 Mac 上的 Catalyst 下运行时[UIDevice currentDevice].model返回。@"iPad"用户界面习语 API 维持着同样的错觉。

我发现你真的需要更深入地研究。我从这些信息开始:

NSString *const deviceModel = [UIDevice currentDevice].model;
NSProcessInfo *const processInfo = [[NSProcessInfo alloc] init];
const bool isIosAppOnMac = processInfo.iOSAppOnMac;  // Note: this will be "no" under Catalyst
const bool isCatalystApp = processInfo.macCatalystApp;

然后,您可以将这些查询与诸如[deviceModel hasPrefix: @"iPad"]整理出我所面临的各种微妙之处的表达式结合起来。就我而言,我明确希望避免制作 UIPickerView 如果指示isCatalystApptrue,独立于关于界面习语的“误导性”信息,或者由isIosAppOnMacand维持的错觉deviceModel

现在我很好奇如果我将 Mac 应用程序移动到我的 iPad 边车上运行会发生什么......

于 2020-12-06T10:37:49.380 回答
0

对于最新版本的 iOS,只需添加UITraitCollection

extension UITraitCollection {

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

然后UIViewController检查:

if traitCollection.isIpad { ... }
于 2017-02-06T13:36:23.107 回答
0
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }
于 2017-04-27T10:03:47.463 回答