Ios 如何使用自适应分段在UITableView中实现UIVisualEffectView

Ios 如何使用自适应分段在UITableView中实现UIVisualEffectView,ios,uitableview,swift,uipopovercontroller,modalviewcontroller,Ios,Uitableview,Swift,Uipopovercontroller,Modalviewcontroller,我想实现UIVisualEffectView对视图应用模糊效果,以显示其背后的视图 这个背景模糊的视图是嵌入在UINavigationController中的UITableViewController,它将在iPad上的popover中显示,或者在iPhone上以全屏模式显示,这要感谢iOS 8自适应分段(以popover的形式显示)。当这个视图控制器在popover中时,我希望背景模糊popover下面的内容,当它全屏显示时,我希望背景模糊上一个视图控制器 我曾试图实施这一点,但没有成功。我甚

我想实现
UIVisualEffectView
对视图应用模糊效果,以显示其背后的视图

这个背景模糊的视图是嵌入在
UINavigationController
中的
UITableViewController
,它将在iPad上的popover中显示,或者在iPhone上以全屏模式显示,这要感谢iOS 8自适应分段(以popover的形式显示)。当这个视图控制器在popover中时,我希望背景模糊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
,尝试使用自动布局约束而不是设置框架,但没有任何效果。你能帮我完成想要的行为吗

我试图获得的示例:
iPad popover:

iPhone模态演示:

我终于找到了解决办法。我必须创建两个单独的segue——一个用于仅在iPad上调用的Popover演示,另一个用于iPhone的模式segue,演示样式设置为全屏(这很重要)

在显示的表格视图控制器中,在
viewDidLoad
中,此代码将应用所需的模糊效果(以及额外效果,仅当它们未禁用透明度效果时):


这会使表格背景与屏幕截图中的一样出现。iPhone的诀窍是确保在屏幕上显示,而iPad的诀窍是删除
popoverPresentationController中的
背景色
,使用自适应添加模糊的快速示例:

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+中)最好的解决方案是在故事板中使用UIVisualEffectView,并使其成为我的ViewController的根视图。然后将我的tableview添加到该视图中

要查找视觉效果视图,请转到右下角的组件选择器(不确定其名称)并搜索VisualEffectView


这似乎是一种更简单的方法,符合苹果的建议,即尽可能多地在故事板上进行操作

这是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

    }

我没有看到“全屏”的演示风格。那只是iOS 8吗?@livingtech是的。Adaptive segues(以及解决方案中使用的其他API)仅在iOS 8+上可用。我还注意到iPad2和iPadRetina模拟器没有显示模糊,它使视图仅为半透明。所有其他模拟器都可以正常工作,包括iPhone4S。请不要被这个问题所困扰,因为我第一次认为UIVisualEffectView不起作用。单元格呢?@yar1vn请随意添加答案
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

    }