在学习坐标空间中,涉及iOS设备屏幕分辨率等知识,在这里进行梳理。
代码输出分辨率
首先,当需要获取整个iOS设备的屏幕分辨率时,可以通过设置一个填充的视图,然后添加GeometryReader获取分辨率:
struct ContentView: View {
var body: some View {
Rectangle()
.opacity(0.2)
.edgesIgnoringSafeArea(.all)
.background(
GeometryReader { proxy in
Text("分辨率")
.onTapGesture {
let screenScale = UIScreen.main.scale
print("Screen Scale: \(screenScale)")
print("Logical Width x Height: \(proxy.size.width) x \(proxy.size.height)")
print("Physical Width x Height: \(proxy.size.width * screenScale) x \(proxy.size.height * screenScale)")
}
}
.edgesIgnoringSafeArea(.all)
)
}
}
截图为iphone 15 pro
当点击屏幕左上角的“分辨率”时,输出的内容为:
Screen Scale: 3.0
Logical Width x Height: 393.0 x 852.0
Physical Width x Height: 1179.0 x 2556.0
这里涉及到分辨率的知识:
1、屏幕缩放比例
let screenScale = UIScreen.main.scale
这段代码获取的事屏幕缩放比例,代表屏幕每个点显示了两倍或三倍的像素。
在 Retina 屏幕上,这个值通常是 2.0 或 3.0
2、逻辑尺寸
print("Logical Width x Height: \(proxy.size.width) x \(proxy.size.height)")
proxy.size: 通常是在 SwiftUI 中使用 GeometryReader 提供的 GeometryProxy 对象。
proxy.size.width: 获取视图的逻辑宽度(以点为单位)。
proxy.size.height: 获取视图的逻辑高度(以点为单位)。
逻辑尺寸: 这是设备屏幕上的“点”单位,不直接反映屏幕的物理像素。
在屏幕上调整宽高和位置,使用的都是逻辑尺寸。
3、物理尺寸
print("Physical Width x Height: \(proxy.size.width * screenScale) x \(proxy.size.height * screenScale)")
这里计算并打印视图在屏幕上的物理尺寸(以像素为单位)。
物理宽度: proxy.size.width * screenScale
物理高度: proxy.size.height * screenScale
物理尺寸: 是逻辑尺寸乘以屏幕缩放比例后得出的值,反映实际像素数。
因此,可以总结为在应用中使用的逻辑尺寸需要乘以屏幕缩放比例,然后可以得出物理尺寸:
Physical Width x Height: 1179.0 x 2556.0
这一物理尺寸也可以在网络中得到验证。
模拟器输出分辨率
如果需要使用应用进行尺寸的描画,也可以在Xcode中运行模拟器,然后使用模拟器的截图获取截图的尺寸,也就是设备的物理分辨率。
在截屏的图片信息中,可以查看到相应的尺寸为:1179*2556。
总结
可以通过代码或者模拟器来输出分辨率,也可以从网络上查找到对应的屏幕分辨率。
屏幕缩放比例通常为2.0或3.0,通过GeometryReade可以获取到相关的尺寸信息。
重要的是,可以通过逻辑尺寸和屏幕缩放比例或得到实际的物理尺寸,以便在实际上使用。
值得注意的是,我在代码输出分辨率的部分中,使用了两个edgesIgnoringSafeArea,以便让Rectangle占满屏幕以及GeometryReader无视安全区域。
如果不使用edgesIgnoringSafeArea,那么得到的尺寸也就是GeometryReader的尺寸,会缩减为:
Screen Scale: 3.0
Logical Width x Height: 393.0 x 759.0
Physical Width x Height: 1179.0 x 2277.0
可以看到,紫色区块的尺寸为1179 * 2277,刚好覆盖Rectangle所在的灰色区块。
相关文章
SwiftUI容器视图GeometryReade:https://fangjunyu.com/2024/12/15/swiftui%e5%ae%b9%e5%99%a8%e8%a7%86%e5%9b%begeometryreader/