我有一款应用可以在iPhone和iPod Touch上运行,也可以在Retina iPad和其他设备上运行,但需要做一些调整。我需要检测当前设备是否是iPad。我可以用什么代码来检测用户是否在我的UIViewController中使用iPad,然后相应地改变一些东西?


当前回答

很多答案都很好,但我在swift 4中使用这样的答案

创建常量 struct App { 静态let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ?True: false } 像这样使用 if App.isRunningOnIpad { 返回加载(from: .main, identifier: identifier) }其他{ 返回加载(from: .ipad, identifier: identifier) }

编辑:建议ceure简单地在UIDevice上创建一个扩展

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

其他回答

你也可以用这个

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

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

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

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

这些api可能会给普通的pre-Catalyst读者带来误导性的结果。例如:[UIDevice currentDevice]。当在Mac上的Catalyst下运行时,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,如果指示的isCatalystApp为真,独立于“误导”信息的接口习语,或由isIosAppOnMac和deviceModel维持的幻觉。

现在我很好奇,如果我把Mac应用程序移动到我的iPad挎斗上会发生什么……

*

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

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

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