Come usare UIVisualEffectView per sfocare l'immagine?


208

Qualcuno potrebbe dare un piccolo esempio di applicazione della sfocatura a un'immagine? Ho cercato di capire il codice per un po 'di tempo :( ancora nuovo in obj c!

Il UIVisualEffectViewfornisce una semplice astrazione su effetti visivi complessi. A seconda dell'effetto desiderato, i risultati possono influire sul contenuto stratificato dietro la vista o sul contenuto aggiunto alla vista contenuto della vista.

Applica a UIVisualEffectViewa una vista esistente per applicare un effetto di sfocatura o vibrazione alla vista di uscita. Dopo aver aggiunto UIVisualEffectView alla gerarchia della vista, aggiungere eventuali visualizzazioni secondarie a contentView di UIVisualEffectView. Non aggiungere visualizzazioni secondarie direttamente a UIVisualEffectViewse stesso.

https://developer.apple.com/documentation/uikit/uivisualeffectview#//apple_ref/occ/instp/UIVisualEffectView/contentView


1
Fare attenzione a aggiungere viste a UIVisualEffectView's contentView github.com/onmyway133/blog/issues/124
onmyway133

Inoltre, se lo si aggiunge a una sottoview e si imposta il suo frame, non dimenticare di aggiornare il frame in viewDidLayoutSubviews per assicurarsi che la rotazione funzioni.
Steve Moser,

Risposte:


415

Basta mettere questa vista sfocatura su imageView. Ecco un esempio in Objective-C:

UIVisualEffect *blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

UIVisualEffectView *visualEffectView;
visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

visualEffectView.frame = imageView.bounds;
[imageView addSubview:visualEffectView];

e veloce:

var visualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .Light))    

visualEffectView.frame = imageView.bounds

imageView.addSubview(visualEffectView)

3
grazie mille! Ho dimenticato di impostare il frame :( Non c'è ancora nulla su Google per la visualizzazione, quindi questo dovrebbe essere il primo termine di ricerca :)
cNoob,

1
Spero meglio che l'API non cambi! Questo è uno dei motivi per cui le API Apple non ancora rilasciate possono essere complicate. Ad esempio, alcune API di UIKit Dynamics cambiano leggermente tra beta e release. Niente di grave, ma avrebbero infranto qualsiasi codice di esempio scritto rispetto alle API originali.
Zev Eisenberg,

5
Esiste un modo per animare la sfocatura in / out?
Ruben Martinez Jr.

3
@BS Puoi animare l'alfa della vista effetti visivi. Boom.
Maciej Trybiło,

2
UIBlurEffect è fantastico, ma nota che non funziona su dispositivi più vecchi come l'iPad2 - ho passato ore a cercare di capire perché stava solo mettendo uno strato traslucido sullo schermo e non sfuocando - era tutto perché stavo testando su un dispositivo più vecchio
Keith,

135

Ecco come utilizzare UIVibrancyEffect e UIBlurEffect con UIVisualEffectView

Objective-C:

// Blur effect
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
[blurEffectView setFrame:self.view.bounds];
[self.view addSubview:blurEffectView];

// Vibrancy effect
UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect];
[vibrancyEffectView setFrame:self.view.bounds];

// Label for vibrant text
UILabel *vibrantLabel = [[UILabel alloc] init];
[vibrantLabel setText:@"Vibrant"];
[vibrantLabel setFont:[UIFont systemFontOfSize:72.0f]];
[vibrantLabel sizeToFit];
[vibrantLabel setCenter: self.view.center];

// Add label to the vibrancy view
[[vibrancyEffectView contentView] addSubview:vibrantLabel];

// Add the vibrancy view to the blur view
[[blurEffectView contentView] addSubview:vibrancyEffectView];

Swift 4:

    // Blur Effect
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = view.bounds
    view.addSubview(blurEffectView)

    // Vibrancy Effect
    let vibrancyEffect = UIVibrancyEffect(blurEffect: blurEffect)
    let vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect)
    vibrancyEffectView.frame = view.bounds

    // Label for vibrant text
    let vibrantLabel = UILabel()
    vibrantLabel.text = "Vibrant"
    vibrantLabel.font = UIFont.systemFont(ofSize: 72.0)
    vibrantLabel.sizeToFit()
    vibrantLabel.center = view.center

    // Add label to the vibrancy view
    vibrancyEffectView.contentView.addSubview(vibrantLabel)

    // Add the vibrancy view to the blur view
    blurEffectView.contentView.addSubview(vibrancyEffectView)

1
La soluzione alternativa funziona anche senza sottoclasse, basta definireextension UILabel { override func tintColorDidChange() { textColor = tintColor; super.tintColorDidChange() } }
Palimondo il

1
Apple sembra aver corretto il bug. La soluzione alternativa alla sottoclasse / estensione non è più necessaria in iOS 8 beta 2.
Benjamin Mayo,

2
Grazie. Ho testato e confermato la correzione di bug e modificato la risposta.
Matt Rundle,

1
Sto cercando di aggiungere questo alla mia vista ma ogni volta che presento la vista, viene sfocata ancora e ancora fino a quando non ottengo uno sfondo bianco ... Sto rimuovendo la vista con removeFromSuperView dopo averlo eliminato ma ottengo lo stesso risultato .. .. qualche idea?
George Asda,

@GeorgeAsda che ne dici invece di chiamare removeFromSuperView, fai il [self.visualEffectView setHidden:NO];? Allocare e aggiungere alla vista è un'operazione costosa che nascondere o visualizzare.
Yoon Lee,

46

Puoi anche usare l'interfaccia builder per creare facilmente questi effetti per situazioni semplici. Poiché i valori z delle viste dipenderanno dall'ordine in cui sono elencati nella struttura del documento, è possibile trascinare a UIVisualEffectViewsulla struttura del documento prima della vista che si desidera sfocare. Questo crea automaticamente un nidificato UIView, che è la contentViewproprietà del dato UIVisualEffectView. Nidifica le cose in questa vista che vuoi apparire in cima alla sfocatura.

XCode6 beta5

Puoi anche sfruttare facilmente la vivacità UIVisualEffect, che creerà automaticamente un altro nidificato UIVisualEffectViewnella struttura del documento con la vibrazione abilitata per impostazione predefinita. È quindi possibile aggiungere un'etichetta o una vista di testo al nidificato UIView(di nuovo, la contentViewproprietà di UIVisualEffectView), per ottenere lo stesso effetto dell'elemento dell'interfaccia utente "> diapositiva per sbloccare".

inserisci qui la descrizione dell'immagine


Puoi confermare che ciò che viene mostrato è effettivamente sfocato? La mia immagine (quella che hai chiamato "BackgroundPhoto" nella tua gerarchia) è appena oscurata in una vista Sfocatura: Scuro traslucida. (Rilascio della versione di Xcode 6.01 e utilizzo del simulatore iOS)
tobinjim

Cosa intendi con 'è solo oscurato'? Non pensi che sia sfocato allora?
oh,

Ok, darò un'occhiata tra poche ore.
oh,

Grazie! Hai una gerarchia di vista sul tuo BackgroundPhoto che è crollata negli screenshot ... Ho appena usato un UIImageView e ho assegnato una foto ad esso (un cane di colore chiaro su sfondo verde - la definizione nitida tra le gambe bianche e l'erba verde è altrettanto nitido quando coperto dalla vista dell'effetto visivo come quando non lo è).
Tobinjim,

1
Ho visto che cambiando il tipo di sfocatura in Scuro, l'etichetta diventa di colore bianco ...
Daniel,

8

Preferisco creare effetti visivi tramite Storyboard - nessun codice utilizzato per creare o mantenere gli elementi dell'interfaccia utente. Mi dà anche il pieno supporto del panorama. Ho realizzato una piccola demo sull'utilizzo di UIVisualEffects con Blur e anche su Vibrancy.

Demo su Github


8

Se qualcuno desidera la risposta in Swift:

var blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark) // Change .Dark into .Light if you'd like.

var blurView = UIVisualEffectView(effect: blurEffect)

blurView.frame = theImage.bounds // 'theImage' is an image. I think you can apply this to the view too!

Aggiornare :

A partire da ora, è disponibile sotto l'IB, quindi non è necessario codificare nulla per esso :)


2
-(void) addBlurEffectOverImageView:(UIImageView *) _imageView
{
    UIVisualEffect *blurEffect;
    blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];

    UIVisualEffectView *visualEffectView;
    visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

    visualEffectView.frame = _imageView.bounds;
    [_imageView addSubview:visualEffectView];
}

Aggiungete un po 'di testo con risposta per come la vostra risposta aiuto OP nel fissare problema postato
ρяσѕρєя K

0

Viene utilizzato per sfocare gli sfondi, chiari o scuri, in modo che il testo possa essere sovrapposto più facilmente. Se lo desideri, puoi abilitare la vivacità, il che rende il testo reso in un colore brillante e contrastante accanto alla sfocatura.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.