提问人:Albert Renshaw 提问时间:4/16/2012 最后编辑:General GrievanceAlbert Renshaw 更新时间:6/9/2023 访问量:168590
iOS 检测用户是否在 iPad 上
iOS detect if user is on an iPad
问:
我有一个在 iPhone 和 iPod Touch 上运行的应用程序,它可以在 Retina iPad 上运行,但需要进行一次调整。我需要检测当前设备是否是 iPad。我可以使用什么代码来检测用户是否在我的 iPad 中使用,然后相应地更改某些内容?UIViewController
答:
有很多方法可以检查设备是否是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
评论
UI_USER_INTERFACE_IDIOM()
([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)
BOOL iPad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; … if (iPad) …
if UIDevice.currentDevice().userInterfaceIdiom == .Pad
我发现某些解决方案在 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 模拟器”的形式返回,因此上面的调整应该可以解决这个问题。
评论
hasSuffix:@"iPad"
isEqualToString@"iPad"
这是 iOS 3.2 的 UIDevice 的一部分,例如:
[UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad
评论
你也可以用这个
#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
...
if (IPAD) {
// iPad
} else {
// iPhone / iPod Touch
}
UI_USER_INTERFACE_IDIOM()
仅当应用适用于 iPad 或通用时才返回 iPad。如果它是在 iPad 上运行的 iPhone 应用程序,那么它不会。因此,您应该检查模型。
您可以检查 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。
在 Swift 中,您可以使用以下等号来确定通用 App 上的设备类型:
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
}
评论
userInterfaceIdiom
.Phone
.Pad
在 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 或通用,则仅返回 iPad。如果它是在 iPad 上运行的 iPhone 应用程序,那么它不会。因此,您应该检查模型。:
class func isUserUsingAnIpad() -> Bool {
if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad {
return true
} else {
return false
}
}
如果类没有继承 ,下面的代码片段不会编译,否则它就可以正常工作。仅当应用程序适用于 iPad 或 Universal 时,才会返回 iPad。如果它是在 iPad 上运行的 iPhone 应用程序,那么它不会。因此,您应该检查模型。:UIViewController
UI_USER_INTERFACE_IDIOM()
class func isUserUsingAnIpad() -> Bool {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad) {
return true
} else {
return false
}
}
评论
请注意:如果您的应用仅面向 iPhone 设备,则以 iPhone 兼容模式运行的 iPad 将返回以下语句的 false:
#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
检测物理iPad设备的正确方法是:
#define IS_IPAD_DEVICE ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])
另一种 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!
}
*
在 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
}
对于最新版本的 iOS,只需添加:UITraitCollection
extension UITraitCollection {
var isIpad: Bool {
return horizontalSizeClass == .regular && verticalSizeClass == .regular
}
}
然后在检查中:UIViewController
if traitCollection.isIpad { ... }
评论
if(UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.pad)
{
print("This is iPad")
}else if (UI_USER_INTERFACE_IDIOM () == UIUserInterfaceIdiom.phone)
{
print("This is iPhone");
}
为什么这么复杂?我就是这样做的......
斯威夫特 4:
var iPad : Bool {
return UIDevice.current.model.contains("iPad")
}
这样你就可以说if iPad {}
评论
许多答案都很好,但我在 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) }
编辑:根据建议,只需在UIDevice上创建一个扩展
extension UIDevice {
static let isRunningOnIpad = UIDevice.current.userInterfaceIdiom == .pad ? true : false
}
评论
App
UIDevice
在 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
}
我不认为这些答案中的任何一个都符合我的需要,除非我从根本上误解了什么。
我有一个应用程序(最初是一个 iPad 应用程序),我想在 iPad 和 Mac 上的 Catalyst 下运行它。我正在使用 plist 选项来缩放 Mac 界面以匹配 iPad,但如果合理,我想迁移到 AppKit。在 Mac 上运行时,我相信上述所有方法都告诉我我在 iPad 上。Catalyst 的假货非常彻底。
对于大多数问题,我确实理解代码应该假装它在 iPad 上,从而在 Mac 上运行。一个例外是,滚动选取器在 Catalyst 下的 Mac 上不可用,但在 iPad 上可用。我想弄清楚是在运行时创建 UIPickerView 还是执行不同的操作。运行时选择至关重要,因为我希望使用单个二进制文件长期在 iPad 和 Mac 上运行,同时充分利用每个版本支持的 UI 标准。
这些 API 会给普通的 Catalyst 前读者带来潜在的误导性结果。例如,在 Mac 上的 Catalyst 下运行时返回。用户界面惯用语 API 也保持着同样的错觉。[UIDevice currentDevice].model
@"iPad"
我发现你真的需要更深入地研究。我从以下信息开始:
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;
然后,您可以将这些查询与表达式相结合,例如整理出我面临的各种微妙之处。就我而言,如果指示的 是 ,我明确希望避免制作 UIPickerView,这与有关界面习语的“误导性”信息或由 和 维持的错觉无关。[deviceModel hasPrefix: @"iPad"]
isCatalystApp
true
isIosAppOnMac
deviceModel
现在我很好奇,如果我将 Mac 应用程序移动到我的 iPad 边车上运行会发生什么......
评论