uipopoverpresentationcontroller present modally modal ios uitableview swift uipopovercontroller modalviewcontroller

ios - present - Cómo implementar UIVisualEffectView en UITableView con segues adaptativos



swift present modal view controller programmatically (4)

Me gustaría implementar UIVisualEffectView para aplicar un efecto de desenfoque a una vista para mostrar la vista que se encuentra detrás.

Esta vista que debe tener su fondo borroso es un UITableViewController que está incrustado en un UINavigationController , y se presentará en un popover en iPad o se presentará a pantalla completa modalmente en iPhone, gracias a los sucesivos adaptativos iOS 8 (Presente como Popover ) Cuando este controlador de vista está en un popover, quiero que el fondo difumine lo que está debajo del popover, y cuando se presenta a pantalla completa, quiero que el fondo difumine el controlador de vista anterior.

He tratado de implementar esto y no he tenido éxito. Ni siquiera puedo conseguir que el efecto de desenfoque funcione para el popover. Pensé que este código debería hacer el truco:

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

También traté de agregar la subvista a tableView.backgroundView , traté de configurar el backgroundView en mi effectView , traté de usar restricciones de Autolayout en lugar de establecer el marco, pero nada funcionó. ¿Puedes ayudarme a lograr el comportamiento deseado?

Un ejemplo de lo que estoy tratando de obtener:
iPad popover:

presentación modal de iPhone:


Un ejemplo rápido para agregar el desenfoque usando 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) } } }


Un poco tarde para la mesa con este, pero la mejor solución para mí (en ios8 +) fue tomar UIVisualEffectView en Storyboard y convertirlo en la vista raíz de mi ViewController. Luego agrega mi tabla de vista a eso

Para encontrar la Vista de efecto visual, vaya al Selector de componentes (no estoy seguro de lo que se llama) en la parte inferior derecha y busque VisualEffectView

Esta parece ser una forma mucho más sencilla de hacerlo, y coincide con la recomendación de Apple de hacer todo lo posible en Storyboard.


Finalmente encontré una solución. Tuve que crear dos segmentos separados: uno para una presentación Popover que se llama solo en iPad, y el otro una transición modal con estilo de presentación establecido en pantalla completa (eso es importante) para iPhone.

En el controlador de vista de tabla que se está presentando, en viewDidLoad , este código aplicará el efecto de desenfoque deseado (y bonificación, solo si no han deshabilitado los efectos de transparencia):

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

Esto hace que el fondo de la tabla aparezca como lo hace en las capturas de pantalla. El truco para iPhone era asegurarse de que se presentara en la pantalla, mientras que el truco para iPad era eliminar el backgroundColor en el popoverPresentationController .


Un pequeño cambio para 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 }