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

SwiftUI中Sheet Modal无法完整展示视图,iPad横屏宽度受限如何解决?

方案1:iOS 16+ 原生实现

直接在sheet内容视图上添加如下修饰符即可解除iPad横屏默认宽度限制:

struct DrawingViewView: View {
  var body: some View {
    Rectangle()
      .fill(Color.red)
      .frame(width: 1500, height: 1000)
      // 新增修饰符
      .presentationSizing(.fittingSize)
      .presentationCompactAdaptation(.none)
  }
}
  • .presentationSizing(.fittingSize) 会让sheet自动适配你内容的实际尺寸,不会强制压缩到系统默认的最大宽度
  • .presentationCompactAdaptation(.none) 禁用iPad横屏下的sheet紧凑适配规则,避免宽度被限制
方案2:iOS 15及更低版本兼容实现

通过桥接UIKit修改sheet底层配置,自定义尺寸:

  1. 先添加View扩展
extension View {
    func customSheetSize(size: CGSize) -> some View {
        self.background(SheetConfigurator(size: size))
    }
}

struct SheetConfigurator: UIViewRepresentable {
    let size: CGSize
    
    func makeUIView(context: Context) -> UIView {
        let view = UIView()
        DispatchQueue.main.async {
            guard let parentVC = view.window?.rootViewController?.presentedViewController else { return }
            parentVC.preferredContentSize = size
            if let sheet = parentVC.sheetPresentationController {
                // 可根据需求调整圆角、显示指示器等配置
                sheet.prefersScrollingExpandsWhenScrolledToEdge = false
            }
        }
        return view
    }
    
    func updateUIView(_ uiView: UIView, context: Context) {}
}
  1. 在你的内容视图调用扩展
struct DrawingViewView: View {
  var body: some View {
    Rectangle()
      .fill(Color.red)
      .frame(width: 1500, height: 1000)
      .customSheetSize(size: CGSize(width: 1500, height: 1000))
  }
}
PencilKit适配说明

上述方案不需要使用fullScreenCover,可直接规避fullScreenCover场景下PKCanvasView的坐标偏移问题。如果后续需要使用fullScreenCover,只需要在PKCanvasView外层包裹一个普通的容器视图,显式设置edgesIgnoringSafeArea(.all)即可修复坐标偏移问题。

内容的提问来源于stack exchange,提问作者jakob witsch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:45:05