如何在UITableView中实现UIVisualEffectView和自适应search

我想实现UIVisualEffectView来将一个模糊效果应用到一个视图来显示它背后的视图。

这个应该使其背景模糊的视图是一个UITableViewController ,它embedded在UINavigationController ,它将被呈现在iPad上的popup窗口中,或者它将在iPhone上以全屏模式呈现,这要归功于iOS 8自适应游戏(Popover Popover )。 当这个视图控制器处于popup窗口中时,我想让背景模糊popover下面的内容,当它显示为全屏时,我想让背景模糊前一个视图控制器。

我试图实现这一点,并没有取得成功。 我甚至无法得到模糊效果为popover工作。 我认为这个代码应该做的伎俩:

 //In viewDidLoad on the UITableViewController subclass: let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light)) effectView.frame = tableView.frame tableView.addSubview(effectView) 

我也尝试添加子视图到tableView.backgroundView ,我试图设置backgroundView到我的effectView ,我尝试使用Autolayout约束,而不是设置框架,但没有任何工作。 你能帮我完成想要的行为吗?

我试图获得的一个例子:
iPad popover:
在这里输入图像说明

iPhone模态演示:
在这里输入图像说明

我终于find了一个解决scheme。 我必须创build两个单独的赛段 – 一个用于仅在iPad上调用的Popover Presentation,另一个用于iPhone的Presentation Style设置为Over Full Screen(对于iPhone来说很重要)的模式轮播。

在呈现的表格视图控制器中,在viewDidLoad ,此代码将应用所需的模糊效果(仅在未禁用透明效果时才会使用奖励):

 if (!UIAccessibilityIsReduceTransparencyEnabled()) { tableView.backgroundColor = UIColor.clear let blurEffect = UIBlurEffect(style: .light) let blurEffectView = UIVisualEffectView(effect: blurEffect) tableView.backgroundView = blurEffectView //if inside a popover if let popover = navigationController?.popoverPresentationController { popover.backgroundColor = UIColor.clear } //if you want translucent vibrant table view separator lines tableView.separatorEffect = UIVibrancyEffect(blurEffect: blurEffect) } 

这会导致表格背景显示就像在屏幕截图中一样。 iPhone的诀窍是确保它在屏幕上显示,而iPad的诀窍是删除popoverPresentationController中的popoverPresentationController

使用Adaptivity添加模糊的快速示例:

 extension ViewController: UIPopoverPresentationControllerDelegate { override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { // Grab the destination view controller and set the presentation delegate let viewController = segue.destinationViewController as UIViewController viewController.popoverPresentationController?.delegate = self viewController.presentationController?.delegate = self } // Note: Only called for FormSheet and Popover func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { switch controller.presentedViewController { case let vc as PopoverViewController: return .None // Keep the popover in Compact screens default: return .OverFullScreen } } func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { // This is a custom method on UIViewController controller.presentedViewController.createBlur() // Wrap in a Navigation Controller, the controller should add a title and bar buttons if !(presentedViewController is UINavigationController) { return UINavigationController(rootViewController: presentedViewController) } } } extension UIViewController { func createBlur(effectStyle: UIBlurEffectStyle = .Light) { if !UIAccessibilityIsReduceTransparencyEnabled() { view.backgroundColor = UIColor.clearColor() let blurView = UIVisualEffectView(effect: UIBlurEffect(style: effectStyle)) blurView.autoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth blurView.frame = view.bounds view.insertSubview(blurView, atIndex: 0) } } } extension UITableViewController { override func createBlur(effectStyle: UIBlurEffectStyle = defaultBlurEffectStyle) { if !UIAccessibilityIsReduceTransparencyEnabled() { tableView.backgroundColor = UIColor.clearColor() let blurEffect = UIBlurEffect(style: effectStyle) tableView.backgroundView = UIVisualEffectView(effect: blurEffect) tableView.separatorEffect = UIVibrancyEffect(forBlurEffect: blurEffect) } } } 

稍微迟到了这个桌子,但对我来说(在ios8 +)最好的解决scheme,是在故事板采取一个UIVisualEffectView,并使其作为我的ViewController的根视图。 然后添加我的tableview

在这里输入图像说明

要find视觉效果视图,请转到右下angular的组件选取器(不确定那是什么称呼)并searchVisualEffectView

在这里输入图像说明

这似乎是一个更简单的方法来解决这个问题,并符合苹果的build议尽可能在故事板上尽可能多

IOS 10 Swift 3的小改动

 if #available(iOS 10.0, *) { let blurEffect = UIBlurEffect(style: .prominent) let blurEffectView = UIVisualEffectView(effect: blurEffect) groupTable.backgroundView = blurEffectView } else { let blurEffect = UIBlurEffect(style: .dark) let blurEffectView = UIVisualEffectView(effect: blurEffect) groupTable.backgroundView = blurEffectView }