You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:45:04