SwiftUI无刘海机型下UIScreen.main.bounds.midY默认不居中问题咨询
问题原因
你的推测是正确的,无刘海机型的偏移确实是状态栏导致的,不需要手动计算状态栏高度,用SwiftUI原生的API即可解决该问题。
UIScreen.main.bounds 获取的是设备整个物理屏幕的坐标范围,而SwiftUI的视图默认会避开系统安全区(无刘海机型顶部状态栏高度为20pt),因此你用全局屏幕的中点坐标定位的黑色星号,会比当前视图的默认中心点向下偏移约10pt,就是你看到的错位效果。
解决方案
两种常用处理方案,按需选择:
- 如果你需要星号在当前视图的可视安全区内居中,直接用
GeometryReader获取当前容器的尺寸计算中点即可,不要调用全局的UIScreen接口:
GeometryReader { proxy in ZStack{ Text("✧") .position(x: proxy.frame(in: .local).minX, y: proxy.frame(in: .local).minY) Text("✧") .foregroundColor(Color.red) Text("✧") .position(x: proxy.size.width/2, y: proxy.size.height/2) } }
- 如果你需要星号在整个物理屏幕(包含状态栏、刘海/灵动岛区域、底部手势条)居中,给ZStack添加
ignoresSafeArea()修饰符即可,系统会自动忽略安全区限制,此时用UIScreen.main.bounds的中点坐标也能和红色默认星号重合:
ZStack{ Text("✧") .position(x: UIScreen.main.bounds.minX, y: UIScreen.main.bounds.minY) Text("✧") .foregroundColor(Color.red) Text("✧") .position(x: UIScreen.main.bounds.midX, y: UIScreen.main.bounds.midY) } .ignoresSafeArea()
补充说明
新款带刘海/灵动岛的机型默认会对全屏视图的安全区做自动适配,所以不需要额外操作就能让SwiftUI视图的坐标锚点和屏幕bounds锚点对齐,不会出现该偏移问题。
内容的提问来源于stack exchange,提问作者William Tong
相关产品推荐
相关产品推荐

