iOS以编程方式获取物理屏幕大小?

这可能吗? 我想要的英寸数,而不是像素数。 我知道这是大约160 PPI。 但不完全。

如果可用,它将在UIScreen或UIDevice,但它不在那里。

您可以从Erica的UIDevice扩展中的信息和维基百科上列出的每个设备的规格中推断出来。

没有一个API会给你这个。 你最好的select是看设备的屏幕尺寸(以点为单位),并从这个推测,如果它是一个iPad或iPhone等,然后使用硬编码值的屏幕尺寸。

这里有一些代码来获得屏幕大小:

CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenWidth = screenRect.size.width; CGFloat screenHeight = screenRect.size.height; 

请注意,宽度和高度可能会交换,具体取决于设备的方向。

以下是估算设备屏幕大小的简短方法。 它是最新的设备更新,但未来可能会失败(所有的猜测方法可能)。 如果设备被镜像,它也会变得困惑(返回设备的屏幕大小,而不是镜像的屏幕大小)

 #define SCREEN_SIZE_IPHONE_CLASSIC 3.5 #define SCREEN_SIZE_IPHONE_TALL 4.0 #define SCREEN_SIZE_IPAD_CLASSIC 9.7 + (CGFloat)screenPhysicalSize { if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize result = [[UIScreen mainScreen] bounds].size; if (result.height < 500) return SCREEN_SIZE_IPHONE_CLASSIC; // iPhone 4S / 4th Gen iPod Touch or earlier else return SCREEN_SIZE_IPHONE_TALL; // iPhone 5 } else { return SCREEN_SIZE_IPAD_CLASSIC; // iPad } } 

您可能需要使用[UIScreen mainScreen].scale;

 CGFloat scale = [UIScreen mainScreen].scale; CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat physicalWidth = screenRect.size.width * scale; CGFloat physicalHeight = screenRect.size.height * scale; 

也许Jeff Hay的代码可以被改编成包括iPad Mini。 诀窍是获取设备的模型标识符。 最近的非视网膜iPad是“iPad2,4”,第一个iPad mini是“iPad2,5”。 现在你需要检查的是如果屏幕缩放是1.0(非视网膜)

虽然这个代码不是面向未来的,但是您可以随时为模型标识符添加更多的规则。

 #import <sys/utsname.h> #define SCREEN_SIZE_IPAD_MINI 7.9 struct utsname systemInfo; uname(&systemInfo); if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && strcasecmp(systemInfo.machine, "iPad2,5") >= 0 [[UIScreen mainScreen] scale] == 1.0) return SCREEN_SIZE_IPAD_MINI 

我使用的“公式”是

 #define IS_iPhone5 ( fabs( (double)[ [ UIScreen mainScreen ] bounds ].size.height - (double)568 ) < DBL_EPSILON ) 

这是一个迅速的方式来获得屏幕尺寸:

 var screenWidth: CGFloat { if UIInterfaceOrientationIsPortrait(screenOrientation) { return UIScreen.mainScreen().bounds.size.width } else { return UIScreen.mainScreen().bounds.size.height } } var screenHeight: CGFloat { if UIInterfaceOrientationIsPortrait(screenOrientation) { return UIScreen.mainScreen().bounds.size.height } else { return UIScreen.mainScreen().bounds.size.width } } var screenOrientation: UIInterfaceOrientation { return UIApplication.sharedApplication().statusBarOrientation } 

这些作为标准function包括在:

https://github.com/goktugyil/EZSwiftExtensions

由于这个问题已经被问到,我创build了一个开源库来处理这个问题: IRLSize 。 它可以在任何方向上使用:在实际维度中测量视图的大小(或整个屏幕),或将视图的大小设置为特定的实际维度。

CGFloat scale = [UIScreen mainScreen].scale; CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenWidth = screenRect.size.width * (scale/100.0f); CGFloat screenHeight = screenRect.size.height * (scale/100.0f);

  • 规模是持续的!

没有人说fixedCoordinateSpace 。 在Swift 3中,以纵向方向获取屏幕尺寸,您应该使用: UIScreen.main.fixedCoordinateSpace.bounds