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

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:23:29