ios - 如何在UITableView中實現UIVisualEffectView和自適應搜索




swift uipopovercontroller (3)

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

我想實現UIVisualEffectView來將一個模糊效果應用到一個視圖來顯示它背後的視圖。

這個應該使其背景模糊的視圖是一個UITableViewController ,它嵌入在UINavigationController ,它將被呈現在iPad上的彈出窗口中,或者它將在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 ,我嘗試使用Autolayout約束,而不是設置框架,但沒有任何工作。 你能幫我完成想要的行為嗎?

我試圖獲得的一個例子:
iPad popover:

iPhone模態演示:


稍微遲到了這個桌子,但對我來說(在ios8 +)最好的解決方案,是在故事板採取一個UIVisualEffectView,並使其作為我的ViewController的根視圖。 然後添加我的tableview

要找到視覺效果視圖,請轉到右下角的組件選取器(不確定那是什麼稱呼)並蒐索VisualEffectView

這似乎是一個更簡單的方法來解決這個問題,並符合蘋果的建議盡可能在故事板上盡可能多


我終於找到了一個解決方案。 我必須創建兩個單獨的賽段 - 一個用於僅在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





modalviewcontroller