25

Arkada görünen görünümü göstermek için bir görüntüye bulanıklık efekti uygulamak için UIVisualEffectView uygulamak istiyorum.UIVisualEffectView, UITableView uygulamasında uyarlamalı seggler ile nasıl uygulanır

onun arka planı bulanık olması gereken bu görünüm, iOS 8 adaptif Segues sayesinde bir UINavigationController gömülü olduğu bir UITableViewController olduğunu ve her iki iPad'de popover sunulacak ya da iPhone'da tam ekran modally sunulacak (Popover olarak mevcut). Bu görünüm denetleyicisi bir popover içerisindeyken arka planın popletin altında ne olduğunu bulanıklaştırmasını istiyorum ve tam ekran sunulduğunda arka planın önceki görünüm denetleyicisini bulanıklaştırmasını istiyorum.

Bunu uygulamaya çalıştım ve başarılı olmadım. Bulanıklaştırma efektini popover için çalışmaya bile alamıyorum. Bu kod hile yapmak gerektiğini düşündüm: Ben de tableView.backgroundView için subview ekleme çalıştı

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

benim effectView için backgroundView ayarlama çalıştı, ben autoLayout kısıtlamaları kullanarak yerine çerçevesini ayarlama çalıştı, ama hiçbir şey çalıştı . İstediğiniz davranışları gerçekleştirmeme yardımcı olabilir misiniz?

ben elde çalışıyorum ne bir örnek:
iPad popover:
enter image description here

iPhone kalıcı sunumu:
enter image description here

cevap

43

Sonunda bir çözüm buldum. Ben sadece iPad'de çağrılan bir Popover Sunumu için diğeri de iPhone için Sunum Stili Full Screen (Tam Ekran) olarak ayarlanmış bir modal segue olmak üzere iki ayrı bölüm oluşturmam gerekiyordu. viewDidLoad yılında, sunulmakta olan tablo görünüm denetleyicisinde

, bu kodu (onlar değil özürlü şeffaflık etkileri yalnızca ve ikramiye) istenen bulanıklık efekti geçerli olacaktır:

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

Bu neden Tablo arka plan, ekran görüntülerinde olduğu gibi görünmek için. IPhone için hile, ekran üzerinden sunulmasını sağlamak için iPad için hile popoverPresentationController kaldırmaktı.

+0

"Over Full Screen" sunum stilini göremiyorum. Bu sadece iOS 8 mi? – livingtech

+2

@livingtech Evet. Uyarlamalı tercihler (ve çözümde kullanılan diğer API'ler) yalnızca iOS 8+ sürümünde kullanılabilir. – Joey

+2

Ayrıca iPad 2 ve iPad Retina simülatörlerinin bulanık görünmediğini fark ettim, bu görüntüyü sadece yarı şeffaf hale getiriyor. Diğer tüm simülatörler iPhone 4s dahil olmak üzere, iyi çalışıyor. Sadece UIVisualEffectView'in – Dmitry

6

Hızlı bir örnek adaptivity kullanarak bulanıklık eklemek için:

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

Biraz geç bu bir, ama (iOS8 + olarak) benim için en iyi çözümü ile masaya, Film Şeridi'nde bir UIVisualEffectView almaktı ve ViewController'ımın root görünümünü yapalım.Sonra sağ alt taraftaki (denilen thats, emin değil) Bileşenler Seçici gidip

enter image description here

VisualEffectView

aramak, Görsel Efekt Görünüm bulmak için bu

enter image description here

benim tableView eklemek

Bu konuda gitmek için çok daha kolay bir yol gibi görünüyor ve olası

0

küçük olduğu Film Şeridi'ne üzerinde olduğu kadar yapmak Apple'ın tavsiyesi doğrultusunda düşer IOS 10 Swift 3 için Değişiklik 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 

    } 
İlgili konular