iOS检测用户是否在iPad上

时间:2012-04-15 23:53:06

标签: ios objective-c swift ipad device

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

17 个答案:

答案 0 :(得分:563)

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

答案 1 :(得分:135)

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
}

答案 2 :(得分:33)

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

[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad

答案 3 :(得分:25)

您也可以使用此

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

答案 4 :(得分:19)

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

答案 5 :(得分:14)

小心:如果您的应用仅针对iPhone设备,则使用iphone兼容模式运行的iPad将在以下声明中返回false:

#define IPAD     UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

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

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

答案 6 :(得分:11)

我发现在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模拟器”的形式返回,因此上述调整应该对其进行排序。

答案 7 :(得分: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
        }
   }
如果该应用适用于iPad或Universal,则

UIDevice.currentDevice().userInterfaceIdiom仅返回iPad。如果它是在iPad上运行的iPhone应用程序,那么它不会。所以你应该检查模型。 :

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

如果该类没有继承UIViewController,则下面的代码段不会编译,否则它可以正常工作。如果该应用适用于iPad或Universal,则无论UI_USER_INTERFACE_IDIOM()仅返回iPad。如果它是在iPad上运行的iPhone应用程序,那么它不会。所以你应该检查模型。 :

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

答案 8 :(得分:7)

*

  

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

答案 9 :(得分:4)

许多答案都很好,但我在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)
    }
    
  3. 修改 如建议Cœur只需在UIDevice上创建扩展程序

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

    }

答案 10 :(得分: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");
}

答案 11 :(得分: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!
}

答案 12 :(得分:1)

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

Swift 4:

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

这样您就可以说if iPad {}

答案 13 :(得分:1)

除非我从根本上误解了某些内容,否则我认为这些答案都无法满足我的需求。

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

对于大多数担忧,我确实理解该代码在Mac上运行时应该假装在iPad上。一个例外是滚动拾取器在Mac上的Catalyst下不可用,但在iPad上可用。我想弄清楚是创建UIPickerView还是在运行时执行 不同的操作。运行时选择至关重要,因为我想长期使用一个二进制文件同时在iPad和Mac上运行,同时充分利用每种二进制文件所支持的UI标准。

这些API可能会给初次使用Catalyst的读者带来潜在的误导性结果。例如,在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"]之类的表达式结合使用,以整理出我所面临的各种细微差别。就我而言,如果指示的isCatalystApptrue,则我明确希望避免制作UIPickerView,而与有关界面习惯用法的“误导”信息或isIosAppOnMac和{ {1}}。

现在,我很好奇,如果我将Mac应用程序移到iPad侧边车上运行,会发生什么情况。

答案 14 :(得分:0)

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

即可
extension UITraitCollection {

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

然后在UIViewController内查看:

if traitCollection.isIpad { ... }

答案 15 :(得分:0)

if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
 {
            print("This is iPad")
 }else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
 {
            print("This is iPhone");
  }

答案 16 :(得分:0)

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
}