SwiftUI启用IgnoringSafeArea时,Y值减1为何致Text偏移47点?
问题:SwiftUI中设置Y坐标10与11时文本位置异常偏移
我想把文本放在图片里的蓝色安全区域线上,所以启用了.edgesIgnoringSafeArea(.all)。但发现当Y坐标设为11以下时,文本会向上跳转47点——明明只差1个单位的Y值,“First”文本却比“Second”文本高出47点,想知道原因。
测试代码:
struct TestView: View { var body: some View { GeometryReader{ geo in Text("First") .edgesIgnoringSafeArea(.all) .position(x: 50, y: 10) Text("Second") .edgesIgnoringSafeArea(.all) .position(x: 50, y: 11) } }}
预览截图:
解答
这是因为**.edgesIgnoringSafeArea的作用时机和position的坐标系逻辑冲突**导致的:
position基于父视图的坐标系布局,GeometryReader默认坐标系包含安全区域,原点(0,0)在屏幕左上角,但安全区域顶部的偏移会影响子视图的布局计算。- 当Y坐标小于安全区域顶部高度(这里约47点)时,
.edgesIgnoringSafeArea(.all)会让文本视图脱离安全区域约束,直接使用屏幕全局坐标系;当Y坐标大于等于安全区域高度时,视图仍处于安全区域范围内,使用GeometryReader的局部坐标系。
直白点说:
- Y=10:小于安全区域顶部高度,文本用全局坐标系,(50,10)对应屏幕左上角往下10点的位置
- Y=11:大于等于安全区域顶部高度,文本用
GeometryReader局部坐标系,(50,11)对应安全区域顶部往下11点的位置——而安全区域顶部距离屏幕顶部有47点,所以两者实际位置差刚好是47点。
解决方法
如果想统一用屏幕全局坐标系布局,把.edgesIgnoringSafeArea(.all)加到GeometryReader上,而非每个Text:
struct TestView: View { var body: some View { GeometryReader{ geo in Text("First") .position(x: 50, y: 10) Text("Second") .position(x: 50, y: 11) } .edgesIgnoringSafeArea(.all) }}
这样GeometryReader的坐标系和屏幕全局坐标系对齐,Y=10和Y=11的位置就只会差1点。
内容的提问来源于stack exchange,提问作者Pasha
相关产品推荐
相关产品推荐

