2015-01-28 16 views
5

Sto provando a creare un sottoporta UIView con un UIBlurEffect come effetto. La vista viene creata dal lato dello schermo e viene quindi inserita utilizzando un'animazione.UIBlurEffect non sfocatura sul dispositivo ma funziona nel simulatore

Tutto funziona perfettamente sul simulatore (ho provato su un iPhone 4S e un iPhone 6) tuttavia sul mio telefono (iPhone 6) la sfocatura non è sfocata, sembra più un grigio scuro con un alpha di 0,5. Inoltre, quando faccio uno screenshot del dispositivo o lo apro dalla schermata Home, la sfocatura viene renderizzata per quel singolo fotogramma prima che il rendering coerente ricominci.

Ecco una schermata di visualizzazione come è al momento: enter image description here

Tuttavia sul dispositivo sfocatura non c'è, è essenzialmente solo una vista trasparente scuro.

Ecco il codice che uso per inizializzare la vista, le proprietà blurView e vibrancyView sono dichiarate come variabili globali:

init(left: Bool){ 
    self.left = left 
    let screenSize = UIScreen.mainScreen().bounds.size 

    var rect: CGRect 
    if left{ 
     rect = CGRectMake(-screenSize.width*0.3, 0, screenSize.width*0.3, screenSize.height) 
    }else{ 
     rect = CGRectMake(screenSize.width, 0, screenSize.width*0.3, screenSize.height) 
    } 

    super.init(frame: rect) 
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) 
    blurView = UIVisualEffectView(effect: blurEffect) 
    blurView.frame = CGRectMake(0, 0, self.frame.width, self.frame.height) 
    self.addSubview(blurView) 
    let vibrancy = UIVibrancyEffect(forBlurEffect: blurEffect) 
    vibrancyView = UIVisualEffectView(effect: vibrancy) 
    vibrancyView.frame = blurView.frame 
    blurView.addSubview(vibrancyView) 

    self.userInteractionEnabled = true 
} 

e per spostare il Superview, che contiene il blurView, in:

func moveIn(){ 
    UIView.animateWithDuration(0.3, animations: {() -> Void in 
     var center = self.center 
     if self.left{ 
      center.x = UIScreen.mainScreen().bounds.size.width*0.15 
     }else{ 
      center.x = UIScreen.mainScreen().bounds.size.width*0.85 
     } 
     self.center = center 
    }) 
} 

Come ho detto prima dell'animazione e funziona bene ma la sfocatura non sfoca.

Non sono sicuro di cosa stia succedendo, mi fa pensare che abbia qualcosa a che fare con il rendering dei fotogrammi ma non sono un guru quindi se qualcuno ha qualche idea sarei più che grato.

risposta

3

Per chiudere questo, è perché sto usando SpriteKit per la maggior parte delle app, e quindi utilizzando SKView e non UIView. Mi rendo conto di non averlo menzionato nella domanda, ma non ero consapevole che sarebbe stato un problema. Apparentemente un SKView segue un diverso percorso di rendering e quindi non si offuscerà, il metodo suggerito è un effectnode.

+0

Hai un collegamento che lo spiega? Ho appena colpito questo problema me stesso. – RSully

+0

Niente da Apple direttamente, ho appena visto un commento da Cocos2D su un'altra domanda simile parlando del percorso di rendering per SKViews e di come è diverso rispetto al tuo UIView di base, e tutto ciò che ho visto sembra sostenere quell'idea. Francamente sto ancora cercando una soluzione di qualche tipo con schermate e varie tecniche di sfocatura, ma nulla si avvicina davvero. Sono tentato di vedere se Apple ha qualcosa da dire al riguardo. –

+2

In realtà, sono riuscito a utilizzare UIVisualEffectView per rendere sfocata una SKView sul dispositivo. Mi è bastato un po 'di ristrutturazione della mia gerarchia di vista. Ha funzionato quando sia il mio SKView che UIVisualEffectView erano subviews diretti dello stesso contenitore UIView. – RSully

0

nella riga blurView.frame = CGRectMake(0, 0, self.frame.width, self.frame.height) nel metodo init self.frame può essere zero prima di layoutSubviews. Imposta blurView frame quando esiste self.frame

Problemi correlati