我有一个可以在iPhone和iPod Touch上运行的应用程序,它可以在Retina iPad上运行,但除此之外需要进行一次调整。我需要检测当前设备是否是iPad。我可以使用哪些代码来检测用户是否在UIViewController
中使用iPad,然后相应地更改内容?
答案 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中的模拟器中,某些解决方案对我不起作用。相反,这有效:
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中使用这样的
创建常量
struct App {
static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}
像这样使用
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
}
答案 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"]
之类的表达式结合使用,以整理出我所面临的各种细微差别。就我而言,如果指示的isCatalystApp
是true
,则我明确希望避免制作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
}