如果 (设备 == iPad),如果 (设备 == iPhone)

30

我有一个通用应用程序,正在设置UIScrollView的内容大小。很明显,在iPhone和iPad上,内容大小会有所不同。我该如何为iPad设置特定大小,为iPhone和iPod touch设置另一种大小?


可能是重复的问题:API to determine whether running on iPhone or iPad - Pang
7个回答

93
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
     // The device is an iPad running iOS 3.2 or later.
}
else
{
     // The device is an iPhone or iPod touch.
}

14
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)

并且

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

宏 UI_USER_INTERFACE_IDIOM() 也可在旧版 iOS(如 iOS 3.0)上正常工作,而不会崩溃。


5

UI_USER_INTERFACE_IDIOM() 是你的最佳解决方案,因为你的应用程序是通用的。但是,如果你在iPad上运行iPhone应用程序,那么UI_USER_INTERFACE_IDIOM()将返回UIUserInterfaceIdiomPhone,而不管设备如何。对于这种情况,你可以使用UIDevice.model属性:

if ([[UIDevice currentDevice].model rangeOfString:@"iPad"].location != NSNotFound) {

    //Device is iPad
}

这是不可靠的。据我所知,UIDevice.model 属性等于“设置”>“关于”中显示的字符串,并且可以被用户更改。来源:https://developer.apple.com/library/ios/documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html#//apple_ref/occ/instp/UIDevice/name - KennethJ
@KennethJ 感谢你的警告,但我已经检查过了,我不这么认为。设置>通用>关于本机>型号显示我的iPhone 5是“MD297B/A”,且不可编辑(在菜单上只有“名称”字段可编辑)。你提供的API链接说明device.model是只读的,而@“iPhone”和@“iPod touch”是可能的值。 - Yunus Nedim Mehel
1
是的,你说得很对,我错误地看着“名称”而不是“型号”。我承认我的错误。 - KennethJ

3
在Swift 2.x中,您可以使用以下等式来确定设备的类型: UIDevice.currentDevice().userInterfaceIdiom == .Phone 或者 UIDevice.currentDevice().userInterfaceIdiom == .Pad 在Swift 3中,对于新手来说,您需要使用以下代码: if UIDevice.current.userInterfaceIdiom == .pad { \\ 可用选项 - .pad, .phone, .tv, .carPlay, .unspecified \\ 在这里实现您的惊人逻辑 }

2

UIDevice类能够告诉你关于设备的一切信息。例如,model属性可以告诉你设备的型号。你可以使用这个属性来决定当前设备应该使用哪个视图。


不建议使用“model”属性,因为它不具备未来可扩展性。 - Constantino Tsarouhas
这是我第一次听说这个。你能给我提供一个链接吗?如果是这样的话,我会删除我的回答。 - csano
1
实际上,我是在一次WWDC关于制作iOS应用程序未来兼容性的会议上听到的。使用model属性会给你一个字符串。如果苹果发布了一个类似于iPhone但有另一个名称的新iOS设备,比如“iPhone nano”,该应用程序将无法正常运行。我建议在这种情况下使用UIScreen的applicationFrame属性。这类似于确定硬件功能:不仅在iPhone和iPad上启用陀螺仪,而是只有当Core Motion这样说时才启用它更好。如果iPod touch或未来的设备也支持它,那么你就有问题了。;-) - Constantino Tsarouhas

1
使用UIScreen类来确定应用程序的框架。
CGRect usableSpace = [[UIScreen mainScreen] applicationFrame];

返回的矩形是屏幕大小减去状态栏的大小。不要使用UI习语来确定可用空间,因为它们不具备未来性。

顺便说一下,UIViewController可以自动调整内容视图(包括滚动视图)的大小,并为您提供其他好处,例如自动旋转。如果适合您的情况,请考虑使用它。


成语现在的形式就是这样,未来改变它也是微不足道的。在我看来,它们比你的建议更加清晰和有意义。 - FeifanZ
1
@Inspire48:问题是:如何正确调整我的滚动视图大小?最简单的方法是使用系统提供的大小。因此,即使在尚未知晓的iDevice上,代码也不会出错,因为您不关心设备(惯用语),而只关心显示(调整滚动视图大小等)。显然,对于许多其他情况,使用惯用语是正确的选择。;-) - Constantino Tsarouhas

0

如果你在使用 Swift,

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.Pad)
    {
     // device is ipad
    }
    else
    {
     //device is  iPhone 
    }

您还可以检查UIUSerInterfaceIdiom并选择您想要的设备UIUserInterfaceIdiom.Pad或UIUserInterfaceIdiom.Phone或UIUserInterfaceIdiom.TV或UIUserInterfaceIdiom.CarPlay


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接