我有一款应用可以在iPhone和iPod Touch上运行,也可以在Retina iPad和其他设备上运行,但需要做一些调整。我需要检测当前设备是否是iPad。我可以用什么代码来检测用户是否在我的UIViewController中使用iPad,然后相应地改变一些东西?
当前回答
斯威夫特的另一种方式:
//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!
}
其他回答
对于最新版本的iOS,只需添加UITraitCollection:
extension UITraitCollection {
var isIpad: Bool {
return horizontalSizeClass == .regular && verticalSizeClass == .regular
}
}
然后在UIViewController中检查:
if traitCollection.isIpad { ... }
注意:如果你的应用只针对iPhone设备,在iPhone兼容模式下运行的iPad将为以下语句返回false:
#define IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
检测实体iPad设备的正确方法是:
#define IS_IPAD_DEVICE ([(NSString *)[UIDevice currentDevice].model hasPrefix:@"iPad"])
你可以检查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");
}
斯威夫特的另一种方式:
//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!
}
我认为这些答案都不能满足我的需要,除非我从根本上误解了某些东西。
我有一个应用程序(最初是一个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挎斗上会发生什么……
推荐文章
- 我应该如何从字符串中删除所有的前导空格?- - - - - -斯威夫特
- Xcode构建失败“架构x86_64未定义的符号”
- 如何使用Xcode创建。ipa文件?
- 动态改变UILabel的字体大小
- registerForRemoteNotificationTypes: iOS 8.0及以上版本不支持
- 新的自动引用计数机制是如何工作的?
- 如何测试对象在Objective-C中的类?
- 在iPhone上确定用户是否启用了推送通知
- 是否有可能禁用浮动头在UITableView与UITableViewStylePlain?
- 从Cocoa应用程序执行一个终端命令
- Swift:理解// MARK
- 错误ITMS-9000:“冗余二进制文件上传。火车1.0版本已经有一个二进制版本上传。
- Swift -转换为绝对值
- Swift编译器错误:“框架模块内的非模块化头”
- 从父iOS访问容器视图控制器