How to implement UIVisualEffectView in UITableView with adaptive segues How to implement UIVisualEffectView in UITableView with adaptive segues ios ios

How to implement UIVisualEffectView in UITableView with adaptive segues


I've finally found a solution. I had to create two separate segues - one for a Popover Presentation which is called only on iPad, and the other a modal segue with Presentation Style set to Over Full Screen (that's important) for iPhone.

In the table view controller that is being presented, in viewDidLoad, this code will apply the desired blur effect (and bonus, only if they haven't disabled transparency effects):

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)}

This causes the table background to appear just like it does in the screenshots. The trick for iPhone was to ensure it's presented over the screen, while the trick for iPad was to remove the backgroundColor in the popoverPresentationController.


A quick example to add the blur using 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)    }  }}


Slightly late to the table with this one, but the best solution for me (in ios8 +), was to take a UIVisualEffectView in the Storyboard and make it the root view of my ViewController. Then add my tableview to that

enter image description here

To find the Visual Effect View, go to the Components Picker (not sure what thats called) on the bottom right hand side and search for VisualEffectView

enter image description here

This seems like a much easier way to go about it, and falls in line with Apple's recommendation to do as much on the Storyboard as possible