Swift中如何隐藏UIPopoverPresentationController的模糊效果?
解决思路:隐藏Popover的模糊背景视图
嘿,我刚好碰到过类似的需求,给你两个实用的解决方向,你可以根据自己的场景选择:
方法一:遍历视图层级隐藏私有模糊视图
系统的Popover模糊背景是UIVisualEffectBackdropView(私有类),我们可以通过递归遍历视图层级找到它并隐藏。注意这种方法依赖私有类名,后续iOS版本更新可能会有变动,所以仅供临时场景或者无法自定义背景时使用。
在你的UITableViewController的viewDidAppear方法里添加这段代码:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 递归查找目标模糊视图 func findBackdropView(in view: UIView) -> UIView? { for subview in view.subviews { // 通过类名字符串判断私有视图 if String(describing: type(of: subview)) == "UIVisualEffectBackdropView" { return subview } // 递归查找子视图 if let foundView = findBackdropView(in: subview) { return foundView } } return nil } // 从当前视图的父视图开始向上遍历,因为模糊背景在contentView的外层 var currentSuperview = view.superview while currentSuperview != nil { if let backdropView = findBackdropView(in: currentSuperview!) { backdropView.isHidden = true break } currentSuperview = currentSuperview?.superview } }
方法二:自定义Popover背景视图(推荐)
更安全的方式是直接替换系统的背景视图为透明或自定义样式,避免依赖私有API。在你准备present Popover的代码里做如下修改:
// 初始化你的TableViewController let tableViewVC = YourCustomTableViewController() tableViewVC.modalPresentationStyle = .popover if let popoverPresenter = tableViewVC.popoverPresentationController { popoverPresenter.sourceView = yourTriggerButton popoverPresenter.sourceRect = yourTriggerButton.bounds // 设置自定义透明背景 let customBackgroundView = UIView() customBackgroundView.backgroundColor = .clear popoverPresenter.backgroundView = customBackgroundView // 记得设置contentVC的背景色,避免显示异常 tableViewVC.view.backgroundColor = .white // 替换成你需要的背景色 } present(tableViewVC, animated: true)
这个方法兼容性更好,不会因为系统更新而失效,是更推荐的方案。
内容的提问来源于stack exchange,提问作者Vadim Nikolaev
相关产品推荐
相关产品推荐

