Swift:解决UITableViewController上自定义弹窗的透明度与滑动问题
解决嵌入导航控制器的TableView上方弹窗的两个问题
刚好我之前也踩过类似的坑,给你针对性的解决办法:
1. 修复弹窗背景透明度不生效的问题
你直接设置弹窗VC的背景色alpha没效果,大概率是因为系统默认的modalPresentationStyle会覆盖你的背景层。iOS在present控制器时,不同的presentation style会自带不同的背景处理(比如模糊、不透明遮罩),导致你自己设置的透明背景被隐藏了。
解决步骤:
- 先把弹窗的
modalPresentationStyle设置为.overFullScreen或者.overCurrentContext,这两个样式会让你的弹窗直接覆盖在当前视图之上,不会替换背景。 - 再设置带alpha值的背景色。
代码示例(Swift):
// 实例化你的弹窗ViewController let filePopupVC = YourFilePopupViewController() // 关键:设置presentation style filePopupVC.modalPresentationStyle = .overFullScreen // 设置透明背景(这里用0.6的黑色半透明,你可以根据需求调整) filePopupVC.view.backgroundColor = UIColor.black.withAlphaComponent(0.6) // 弹出弹窗 present(filePopupVC, animated: true)
如果是用Storyboard创建的弹窗,也可以直接在属性检查器里把「Presentation」选项改成「Over Full Screen」,效果一样。
2. 阻止弹窗被左滑推开的问题
iOS 13及以上版本,当弹窗的modalPresentationStyle为 .pageSheet(默认的automatic在多数场景下会自动用这个)时,系统默认允许通过滑动手势来dismiss弹窗。要禁用这个行为,只需要一行代码:
在present弹窗之前,把弹窗VC的 isModalInPresentation 设置为 true,这样就能锁定弹窗,只能通过你自己写的代码来关闭(比如点击弹窗上的「关闭」按钮调用dismiss(animated: true))。
代码示例(Swift):
let filePopupVC = YourFilePopupViewController() // 禁用系统自带的滑动关闭手势 filePopupVC.isModalInPresentation = true // 加上之前的背景设置 filePopupVC.modalPresentationStyle = .overFullScreen filePopupVC.view.backgroundColor = UIColor.black.withAlphaComponent(0.6) present(filePopupVC, animated: true)
把这两个设置结合起来用,应该就能达到你想要的弹窗效果了~
内容的提问来源于stack exchange,提问作者johnDoe
相关产品推荐
相关产品推荐

