Görüntü Bulanıklaştırmak için UIVisualEffectView nasıl kullanılır?


208

Birisi bir görüntüye bulanıklaştırma uygulamak için küçük bir örnek verebilir mi? Bir süredir kodu anlamaya çalışıyorum :( obj c'de hala yeni!

UIVisualEffectViewKarmaşık görsel etkileri üzerinde basit bir özet sağlar. İstenen etkiye bağlı olarak, sonuçlar görünümün arkasında bulunan içeriği veya görünümün contentView öğesine eklenen içeriği etkileyebilir.

Bir uygula UIVisualEffectViewçıkan görünümüne bir bulanıklık ya da canlılık efektini uygulamak için varolan bir görünüme. Görünüm hiyerarşisine UIVisualEffectView ekledikten sonra, alt görünümlerini UIVisualEffectView. Alt görünümleri doğrudan UIVisualEffectViewkendisine eklemeyin .

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


1
Manzarasının eklemek için dikkatli olun UIVisualEffectViews' contentView github.com/onmyway133/blog/issues/124
onmyway133

Ayrıca bir alt görünüme ekliyorsanız ve çerçevesini ayarlıyorsanız, döndürmenin çalıştığından emin olmak için viewDidLayoutSubviews içindeki çerçeveyi güncellemeyi unutmayın.
Steve Moser

Yanıtlar:


415

Bu bulanık görünümü imageView üzerine koymanız yeterlidir. Objective-C'de bir örnek:

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

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

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

ve Swift:

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

visualEffectView.frame = imageView.bounds

imageView.addSubview(visualEffectView)

3
çok teşekkür ederim! Çerçeveyi ayarlamayı unuttum :( Google'da görsel için henüz hiçbir şey yok, bu yüzden bu ilk arama terimi olmalı :)
cNoob

1
Umarım API değişmez! Henüz piyasaya sürülmemiş Apple API'lerini tartışmanın nedenlerinden biri de bu kadar zor olabilir. Örneğin, bazı UIKit Dynamics API'leri beta ve sürüm arasında biraz değişir. Önemli bir şey değil, ancak orijinal API'lere karşı yazılan herhangi bir örnek kodu kırmış olacaklardı.
Zev Eisenberg

5
Bulanıklığı içeri / dışarı hareketlendirmek için yine de var mı?
Ruben Martinez Jr.

3
@BS Görsel efekt görünümünün alfa'sına animasyon uygulayabilirsiniz. Boom.
Maciej Trybiło

2
UIBlurEffect harika, ancak iPad2 gibi eski cihazlarda çalışmadığını unutmayın - Neden sadece ekranımın üzerine yarı saydam bir katman yerleştirdiğini ve bulanıklaştığını anlamaya çalışmak için saatler harcadım - hepsi daha eski bir cihazda test ediyordum
Keith

135

UIVibualcyEffect ve UIBlurEffect'in UIVisualEffectView ile nasıl kullanılacağı aşağıda açıklanmıştır

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];

Hızlı 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
Geçici çözüm alt sınıflama olmadan bile çalışır, sadece tanımlayınextension UILabel { override func tintColorDidChange() { textColor = tintColor; super.tintColorDidChange() } }
Palimondo

1
Apple hatayı düzeltmiş gibi görünüyor. İOS 8 beta 2'de alt sınıf / uzantı geçici çözümü artık gerekli değildir
Benjamin Mayo

2
Teşekkürler. Hata düzeltmesini test ettim ve onayladım ve cevabı düzenledim.
Matt Rundle

1
Im benim görüşüme eklemek için çalışıyorum ama ben görünümü sunmak her zaman, ben beyaz bir arka plan elde edene kadar tekrar tekrar bulanıklaşıyor ... Ben reddettikten sonra removeFromSuperView ile görünümü kaldırıyorum ama aynı sonucu elde .. .. herhangi bir fikir?
George Asda

@GeorgeAsda nasıl aramak yerine, removeFromSuperViewyapmak [self.visualEffectView setHidden:NO];? Tahsis etmek ve görünüme eklemek, gizleme veya görüntüleme yapmaktan daha pahalı bir işlemdir.
Yoon Lee

46

Basit durumlarda bu efektleri kolayca oluşturmak için arayüz oluşturucuyu da kullanabilirsiniz. Görünümlerin z değerleri, Belge Anahattı'nda listelendikleri sıraya bağlı olacağından UIVisualEffectView, bulanıklaştırmak istediğiniz görünümden önce a'yı belge anahattına sürükleyebilirsiniz . Bu, otomatik olarak verilenin özelliği UIViewolan bir yuvalanmış oluşturur . Bu görünümde bulanıklığın üstünde görünmesini istediğiniz şeyleri iç içe geçirin.contentViewUIVisualEffectView

XCode6 beta5

Ayrıca UIVisualEffect, UIVisualEffectViewvarsayılan olarak etkinliğin etkin olduğu belge ana hattında yuvalanmış başka bir belge oluşturacak olan canlılıktan da kolayca yararlanabilirsiniz . Daha sonra "> kilidini açmak için kaydırın" kullanıcı arabirimi öğesiyle aynı efekti elde etmek için iç içe bir etikete veya metin görünümünü ekleyebilirsiniz UIView(yine, contentViewözelliğinin UIVisualEffectView).

resim açıklamasını buraya girin


Gösterilen şeylerin gerçekten bulanık olduğunu doğrulayabilir misiniz? Resmim (hiyerarşinizde "BackgroundPhoto" olarak adlandırdığınız şey) bir Bulanıklık Stili: Koyu yarı saydam görünüm altında soluk görünüyor. (Xcode
6.01'in

Ne demek 'sadece soluk'? O zaman bulanık olduğunu düşünmüyor musun?
ohhh

Tamam, birkaç saat içinde bir göz atacağım.
ohhh

Teşekkürler! BackgroundPhoto'ınızda ekran görüntülerinde daraltılmış bir görünüm hiyerarşiniz var ... Sadece bir UIImageView kullandım ve ona bir fotoğraf (yeşil arka plana karşı açık renkli bir köpek - beyaz bacaklar ve yeşil çim arasındaki keskin tanım) görsel efekt görünümü ile kaplanmadığında keskin değil).
tobinjim

1
Bulanıklığın türünü Koyu olarak değiştirdiğimi gördüm, etiket beyaz renk alıyor ...
Daniel

8

Görsel Efektleri Storyboard ile oluşturmayı tercih ediyorum - UI Elements oluşturmak veya korumak için kullanılan kod yok. Bana tam manzara desteği de veriyor. UIVisualEffects'i Blur ve Vibrancy ile birlikte kullanarak küçük bir demo yaptım.

Github Demosu


8

Swift'te cevap almak isteyen varsa:

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!

Güncelleme :

Şu andan itibaren, IB altında kullanılabilir, böylece bunun için hiçbir şey kodlamanız gerekmez :)


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];
}

Cevabınızın, yayınlanan sorunu
çözmede

0

Bu, açık veya koyu arka planların bulanıklaştırılması için kullanılır, böylece metin daha kolay bir şekilde yerleştirilebilir. İsteğe bağlı olarak, metnin bulanıklığın yanında parlak, kontrast bir renkte oluşturulmasına neden olan canlılığı etkinleştirebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.