修改前效果 修改后效果
image image

结论

popover 变成类似 sheet 的效果,是 SwiftUI 的预期行为,不是 Bug。

核心原因:自适应布局 (Adaptive Layout)

SwiftUI 的设计哲学之一是“一次编写,到处运行”(Write once, run anywhere)。它会根据不同的设备和屏幕尺寸自动调整 UI 以提供最佳的用户体验,这种调整机制的核心是 尺寸类别 (Size Classes)

尺寸类别 设备场景 弹窗表现
紧凑宽度 (Compact Width) 竖屏 iPhone 等窄屏设备 自动将 popover 适配为 sheet
常规宽度 (Regular Width) iPad、Mac 或横屏 iPhone Max/Plus 等大屏设备 显示为带箭头的悬浮气泡

原因说明
在紧凑宽度环境下,popover 可能遮挡内容或难以交互。SwiftUI 自动优化为底部 sheet 样式以提升小屏体验。

如何强制显示为 Popover?

在 iOS 16.4+ 中,使用 .presentationCompactAdaptation() 修饰符 应用在 popover 的内容视图上

Image(systemName: "info.circle")
    .onTapGesture {
        isShowingPopover.toggle()
    }
    .popover(isPresented: $isShowingPopover, arrowEdge: .bottom) {
        // 在 popover 内容添加修饰符[原文](@context-ref?id=0)
        Text("Popover Content")
            .padding()
            .presentationCompactAdaptation(.popover) // ← 关键代码[原文](@context-ref?id=1)
    }
    .offset(y: 180)