25

Ich möchte UIVisualEffectView implementieren, um einen Effekt auf eine Ansicht zu blenden, um die Ansicht anzuzeigen, die dahinter liegt.So implementieren Sie UIVisualEffectView in UITableView mit adaptiven Segmenten

Diese Ansicht, die ihr Hintergrund verwischt haben sollte, ist ein UITableViewController, die in einem UINavigationController eingebettet ist, und es wird entweder in einem popover auf dem iPad präsentiert werden, oder es wird Vollbild-modal auf iPhone, dank iOS 8 adaptive segues vorgestellt (Präsentieren als Popover). Wenn dieser Ansichts-Controller in einem Popover ist, möchte ich, dass der Hintergrund verwischt, was sich unter dem Popover befindet, und wenn der Vollbildmodus angezeigt wird, möchte ich, dass der Hintergrund den vorherigen Ansichtscontroller verwischt.

Ich habe versucht, dies zu implementieren und waren nicht erfolgreich. Ich kann nicht einmal den Unschärfe-Effekt für das Popover funktionieren lassen. Ich dachte, sollte dieser Code den Trick:

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

Ich habe auch versucht die Subview der tableView.backgroundView Zugabe habe ich versucht, die backgroundView meiner effectView Einstellung habe ich versucht, Automatische Anordnung Einschränkungen anstelle der Einstellung des Rahmens verwendet wird, aber nichts hat funktioniert . Kannst du mir helfen, das gewünschte Verhalten zu erreichen?

Ein Beispiel dafür, was ich versuche, zu erhalten:
iPad popover:
enter image description here

iPhone modal Präsentation:
enter image description here

Antwort

43

Ich habe endlich eine Lösung gefunden. Ich musste zwei separate Segmente erstellen - eines für eine Popover-Präsentation, die nur auf dem iPad aufgerufen wird, und das andere ein Modal-Segment mit Presentation Style für das iPhone auf Over Full Screen (das ist wichtig).

In der Tabelle View-Controller, die in viewDidLoad präsentiert wird, wird dieser Code die gewünschte Unschärfe-Effekt anwenden (und Bonus nur dann, wenn sie nicht deaktiviert Transparenz-Effekte haben):

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

Dies bewirkt, dass die Tabellenhintergrund erscheint genauso wie in den Screenshots. Der Trick für das iPhone war sicherzustellen, dass es über den Bildschirm präsentiert wird, während der Trick für iPad war, die backgroundColor in der popoverPresentationController zu entfernen.

+0

Ich sehe nicht den Präsentationsstil "Over Full Screen". Ist das nur iOS 8? – livingtech

+2

@livingtech Ja. Adaptive Segmente (und andere in der Lösung verwendete APIs) sind nur für iOS 8+ verfügbar. – Joey

+2

Ich habe auch bemerkt, dass iPad 2 und iPad Retina Simulatoren keine Unschärfen zeigen, es macht die Ansicht nur halbtransparent. Alle anderen Simulatoren funktionieren gut, einschließlich iPhone 4s. Lassen Sie sich davon nicht beeindrucken, denn ich dachte zuerst, dass UIVisualEffectView nicht funktioniert – Dmitry

6

Ein kurzes Beispiel die Unschärfe mit Adaptivität hinzuzufügen:

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

Etwas spät an den Tisch mit dieser, aber die besten Lösung für mich (in ios8 +), war eine UIVisualEffectView im Storyboard nehmen und mache es zur Grundansicht meines ViewControllers.Dann fügen Sie zu meinem Tableview dieser

enter image description here

Um die visuelle Effekt-Ansicht finden Sie auf die Komponenten-Picker (nicht sicher, was genannt thats,) auf der Unterseite der rechten Hand und die Suche nach VisualEffectView

enter image description here

Dies scheint ein viel einfacher Weg, um darüber zu gehen, und fällt mit Empfehlung von Apple in Linie wie möglich

auf dem Storyboard so viel zu tun
0

eine kleine Änderung für 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 

    } 
Verwandte Themen