打开UISheetPresentationController时如何让下层ViewController不缩小
问题解决方法
你要实现的效果可以通过配置UISheetPresentationController的相关属性实现,同时你的现有代码存在遗漏调用present方法的问题,修正后的完整方案如下:
1. 核心属性说明
- iOS 16 及以上系统:直接使用系统提供的
prefersPresentingViewControllerFullScreenLayout属性,设为true即可让后方视图控制器保持原有大小不被缩放。 - iOS 15 系统:通过设置
sourceView和sourceRect,让系统判定弹窗从当前视图区域弹出,即可避免后方视图被缩小。 - 若不需要后方视图变暗,可以额外设置
largestUndimmedDetentIdentifier为你当前使用的detent标识,或者直接修改dimmingView的透明度。
2. 修正后的完整代码
@objc func registerSheet(){ let registrationSheet = RegistrationFormViewController() // 统一设置present,不要只写在else分支 registrationSheet.modalPresentationStyle = .pageSheet if #available(iOS 15.0, *) { if let sheet = registrationSheet.presentationController as? UISheetPresentationController{ sheet.detents = [.medium()] // 关闭后方视图缩小 if #available(iOS 16.0, *) { sheet.prefersPresentingViewControllerFullScreenLayout = true } else { // iOS15兼容方案 sheet.sourceView = self.view sheet.sourceRect = self.view.bounds } // 可选:如果不需要后方视图变暗,加上这行 sheet.largestUndimmedDetentIdentifier = .medium } } self.present(registrationSheet, animated: true, completion: nil) }
3. 效果验证
运行代码后弹出medium高度的底部表单时,后方主视图控制器会保持原有布局,不会出现缩小、上移的效果,符合你的需求。
内容的提问来源于stack exchange,提问作者Mr N
相关产品推荐
相关产品推荐

