UIScreen.main.nativeScale
将像素每英寸(PPI)转换为每英寸点数。import UIScreenExtension
然后利用它:
if let pointsPerCentimeter = UIScreen.pointsPerCentimeter {
// code
}
[UIScreen mainScreen].bounds.size
来获得屏幕的物理尺寸,但除了 iPhone 6 Plus 之外的所有设备每个点有多少像素可以找出来,因为它不能像普通的PPI * scale那样被发现,因为iPhone 6 Plus和iPhone 6s Plus引入了新的名为Retina HD的屏幕......所以我认为最好的方法是检查设备是否是iPhone 6 Plus,然后返回401,对于其他设备,我们可以继续使用我想的公式... - Durai Amuthan.H在寻找同样问题的答案时,很明显没有简单的答案,正如之前所述,这需要为设备进行硬编码。我发现的最有信息量的网站,提供了设备尺寸和像素密度(PPI)的信息,网址是https://www.ios-resolution.com。
将这些信息整理到电子表格中后,可以清楚地看出设备的像素密度可以通过屏幕点数和像素尺寸来确定。虽然不完美,但对我测试过的所有设备都有效,除了iPad Mini(但我的应用程序不需要包含它们)。
// MARK: Screen Points Per Inch (PoPI)
// ----------------------------------------------------------------------------------------------------------------------------------
func screenPtsPerInch() -> Double {
// Screen points per inch are derived from https://www.ios-resolution.com
// For Pixels per Inch, multiply PoPI by UIScreen().scale
// Almost all of the current iPads are simply 132.0 popi
// iPad mini's are 163.0 but I have not found a way to differentiate them!
// iPad
guard UIDevice.current.userInterfaceIdiom == .phone else { return 132.0 }
// iPhone
guard let screen = self.window?.windowScene?.screen else { return 152.67 }
let points = screen.bounds
let pixels = screen.nativeBounds
// Pixel width across screen (doesn't change with device rotation)
let pixelWidth = pixels.width
// Point width and height across screen
var screenWidth = points.width
var screenHeight = points.height
if screenWidth > screenHeight { // Points change with screen rotation
screenWidth = points.height
screenHeight = points.width
}
print("Pixel Width: \(pixelWidth)")
print("Screen Width: \(screenWidth)")
print("Screen Height: \(screenHeight)")
if pixelWidth < 1100 {
switch (screenWidth, screenHeight) {
case (320.0, 480.0):
return 163.0
case (320.0, 568.0):
return 163.0
case (375.0, 667.0):
return 163.0
case (375.0, 812.0):
return 158.67
case (414.0, 736.0):
return 133.67
default:
return 163.0
}
} else {
switch (screenWidth, screenHeight) {
case (375.0, 812.0):
return 152.67
case (390.0, 844.0):
return 153.33
case (393.0, 852.0):
return 153.33
case (414.0, 896.0):
return 152.67
case (428.0, 926.0):
return 152.67
case (430.0, 932.0):
return 153.33
default:
return 152.67
}
}
}
// MARK: Screen Device Scale (pixels/point)
// ----------------------------------------------------------------------------------------------------------------------------------
func screenScale() -> Double {
guard let screen = self.window?.windowScene?.screen else { return 2.0 }
print("Native Scale: \(screen.nativeScale)")
return screen.nativeScale
}
iPhone Plus的比例为3,但nativeScale为2.6。
UIKit会将此内容缩小以适应实际屏幕尺寸。Metal或OpenGL ES内容应以精确尺寸呈现。
int screenPPI() {
return [[UIScreen mainScreen] nativeScale] * ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? 132 : 163);
}