如何通过Segue将VC2以底部表单形式呈现为VC1的模态视图?
可以通过Segue实现底部半屏模态呈现功能
完全可以实现,你只需要在prepare(for:sender:)方法中配置目标视图控制器的UISheetPresentationController即可,同时保留现有的回调逻辑。以下是修改后的代码:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showAddChangeGas" { if let vc2 = segue.destination as? AddChangeGasViewController { // 原有回调和参数配置 vc2.gasIndex = gasIndex vc2.callback = { self.gasTableView.reloadData() self.gasIndex = nil } // 配置底部半屏模态 if let sheet = vc2.sheetPresentationController { // 设置支持的尺寸:medium是半屏,large是全屏(可选) sheet.detents = [.medium(), .large()] // 显示顶部拖拽手柄 sheet.prefersGrabberVisible = true // 可选:设置模态背景是否贴合边缘 sheet.prefersEdgeAttachedInCompactHeight = true sheet.widthFollowsPreferredContentSizeWhenEdgeAttached = true } } } }
额外注意事项:
- 确保你的Segue在Storyboard中的Presentation属性设置为
Automatic或Page Sheet(默认就是这两种,无需额外修改)。 - 该方案仅适用于iOS 15及以上版本,若需兼容更低版本需自定义实现,但iOS 15+已覆盖绝大多数用户。
- 如果VC2被包裹在
UINavigationController中,需获取导航控制器的sheetPresentationController而非VC2的:if let navController = segue.destination as? UINavigationController, let vc2 = navController.topViewController as? AddChangeGasViewController { // 配置vc2参数和回调... if let sheet = navController.sheetPresentationController { sheet.detents = [.medium(), .large()] sheet.prefersGrabberVisible = true } }
内容的提问来源于stack exchange,提问作者Jim Burke
相关产品推荐
相关产品推荐

