解决UISheetPresentationController不同档位下标题内边距不一致问题
解决Sheet不同档位下顶部内边距不一致的问题
问题核心是小档位下Sheet的安全区域(Safe Area)与大档位存在差异,SwiftUI的padding(.top, 30)是基于当前安全区域计算的,导致视觉上内边距出现偏差。可以通过以下两种方式修复:
方法一:让视图忽略顶部安全区域约束
直接在PresentedView的根容器上添加忽略顶部安全区域的修饰符,让padding(.top, 30)严格按设置数值生效,不受档位切换影响:
struct PresentedView: View { var body: some View { VStack { Text("Title") .padding(.top, 30) .padding(.bottom, 10) ScrollView { RoundedRectangle(cornerRadius: 14) .frame(width: 300, height: 100, alignment: .center) } } .ignoresSafeArea(.container, edges: .top) // 添加该行忽略顶部安全区域 } }
方法二:固定安全区域内边距(适配复杂场景)
如果需要保留部分安全区域逻辑,可在PresentedViewController中固定顶部安全区域内边距,避免系统在档位切换时自动调整:
class PresentedViewController: UIHostingController<PresentedView> { init() { super.init(rootView: PresentedView()) // 固定顶部安全区域内边距为0 additionalSafeAreaInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) } @MainActor required dynamic init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() // 禁止视图从安全区域自动调整布局边距 view.insetsLayoutMarginsFromSafeArea = false } }
额外提醒:你设置的小档位高度为20,数值过小可能引发内容显示异常,建议调整为更合理的数值(比如100),避免和系统安全区域规则冲突。
内容的提问来源于stack exchange,提问作者user11799
相关产品推荐
相关产品推荐

