Saya ingin memudarkan UIVisualEffectsView dengan UIBlurEffect masuk dan keluar:
var blurEffectView = UIVisualEffectView()
blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
Saya menggunakan animasi normal dalam fungsi yang dipanggil oleh a UIButton
untuk memudarkannya, sama untuk memudar tetapi .alpha = 0
& hidden = true
:
blurEffectView.hidden = false
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut) {
self.blurEffectView.alpha = 1
}
Sekarang, memudar di kedua arah tidak bekerja namun memberikan saya sebuah kesalahan ketika memudar keluar :
<UIVisualEffectView 0x7fdf5bcb6e80>
sedang diminta untuk menghidupkan keburamannya. Ini akan menyebabkan efek tampak rusak sampai opacity kembali ke 1.
Pertanyaan
Bagaimana saya berhasil memudarkan UIVisualEffectView
masuk dan keluar tanpa merusaknya dan mengalami transisi memudar?
Catatan
- Saya mencoba memasukkannya
UIVisualEffectView
ke dalamUIView
dan memudarkan yang satu itu, tidak berhasil
ios
swift
fade
uiblureffect
uivisualeffectview
LinusGeffarth
sumber
sumber
Jawaban:
Saya pikir ini baru di iOS9, tetapi Anda sekarang dapat mengatur efek
UIVisualEffectView
di dalam blok animasi:let overlay = UIVisualEffectView() // Put it somewhere, give it a frame... UIView.animate(withDuration: 0.5) { overlay.effect = UIBlurEffect(style: .light) }
Setel
nil
untuk menghapus.SANGAT PENTING - Saat mengujinya di simulator, pastikan untuk menyetel Penimpaan Kualitas Grafik simulator ke Kualitas Tinggi agar ini berfungsi.
sumber
The Apple dokumentasi (saat ini) menyatakan ...
dan
Saya yakin beberapa konteks penting hilang di sini ...
Saya menyarankan bahwa maksudnya adalah untuk menghindari nilai alfa yang kurang dari 1 untuk tampilan persisten. Menurut pendapat saya, ini tidak berlaku untuk animasi tampilan.
Maksud saya - Saya menyarankan bahwa nilai alpha kurang dari 1 dapat diterima untuk animasi.
Pesan terminal menyatakan:
Membaca ini dengan cermat, efeknya akan tampak rusak. Poin saya tentang makhluk ini:
UIVisualEffect
dengan nilai alfa kurang dari 1 tidak akan ditampilkan sebagaimana yang dimaksudkan / dirancang oleh Apple; danUntuk memperluas jawaban @ jrturton di atas yang membantu saya memecahkan masalah saya, saya akan menambahkan ...
Untuk memudarkan
UIVisualEffect
gunakan kode berikut (Objective-C):UIView.animateWithDuration(1.0, animations: { // EITHER... self.blurEffectView.effect = UIBlurEffect(nil) // OR... self.blurEffectView.alpha = 0 }, completion: { (finished: Bool) -> Void in self.blurEffectView.removeFromSuperview() } )
Saya berhasil menggunakan kedua metode: menyetel
effect
properti kenil
dan menyetelalpha
properti ke0
.Perhatikan bahwa pengaturan
effect
untuknil
menciptakan "flash bagus" (untuk menginginkan penjelasan yang lebih baik) di akhir animasi, sementara pengaturanalpha
untuk0
menciptakan transisi yang mulus.(Beri tahu saya kesalahan sintaks ... Saya menulis di obj-c.)
sumber
Inilah solusi yang akhirnya saya lakukan yang berfungsi pada iOS10 dan versi sebelumnya menggunakan Swift 3
extension UIVisualEffectView { func fadeInEffect(_ style:UIBlurEffectStyle = .light, withDuration duration: TimeInterval = 1.0) { if #available(iOS 10.0, *) { let animator = UIViewPropertyAnimator(duration: duration, curve: .easeIn) { self.effect = UIBlurEffect(style: style) } animator.startAnimation() }else { // Fallback on earlier versions UIView.animate(withDuration: duration) { self.effect = UIBlurEffect(style: style) } } } func fadeOutEffect(withDuration duration: TimeInterval = 1.0) { if #available(iOS 10.0, *) { let animator = UIViewPropertyAnimator(duration: duration, curve: .linear) { self.effect = nil } animator.startAnimation() animator.fractionComplete = 1 }else { // Fallback on earlier versions UIView.animate(withDuration: duration) { self.effect = nil } } } }
Anda juga dapat memeriksa inti ini untuk menemukan contoh penggunaan.
sumber
UIViewPropertyAnimator
adalah satu-satunya hal yang tampaknya berhasil di iOS 11. Terima kasih untuk ini!Hanya solusi - masukkan
UIVisualEffectView
ke tampilan penampung dan ubahalpha
properti untuk penampung itu. Pendekatan itu bekerja dengan sempurna untuk saya di iOS 9. Sepertinya itu tidak lagi berfungsi di iOS 10.sumber
Anda dapat mengubah alfa tampilan efek visual tanpa masalah apa pun, selain peringatan di konsol. Tampilan mungkin tampak transparan sebagian, bukan buram. Tetapi ini biasanya tidak menjadi masalah jika Anda hanya mengubah alfa selama animasi.
Aplikasi Anda tidak akan mogok atau ditolak karena ini. Uji di perangkat nyata (atau delapan). Jika Anda senang dengan tampilannya dan kinerjanya, tidak apa-apa. Apple hanya memperingatkan Anda bahwa itu mungkin tidak terlihat atau bekerja sebaik tampilan efek visual dengan nilai alfa 1.
sumber
Anda dapat mengambil jepretan dari tampilan dasar statis, dan memudarnya masuk dan keluar tanpa menyentuh opasitas tampilan buram. Dengan asumsi ivar blurView:
func addBlur() { guard let blurEffectView = blurEffectView else { return } //snapShot = UIScreen.mainScreen().snapshotViewAfterScreenUpdates(false) let snapShot = self.view.snapshotViewAfterScreenUpdates(false) view.addSubview(blurEffectView) view.addSubview(snapShot) UIView.animateWithDuration(0.25, animations: { snapShot.alpha = 0.0 }, completion: { (finished: Bool) -> Void in snapShot.removeFromSuperview() } ) } func removeBlur() { guard let blurEffectView = blurEffectView else { return } let snapShot = self.view.snapshotViewAfterScreenUpdates(false) snapShot.alpha = 0.0 view.addSubview(snapShot) UIView.animateWithDuration(0.25, animations: { snapShot.alpha = 1.0 }, completion: { (finished: Bool) -> Void in blurEffectView.removeFromSuperview() snapShot.removeFromSuperview() } ) }
sumber
Jika Anda ingin memudarkan Anda UIVisualEffectView - untuk ios10 gunakan UIViewPropertyAnimator
UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:nil]; blurEffectView.frame = self.view.frame; blurEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; UIView *blackUIView = [[UIView alloc]initWithFrame:self.view.frame]; [bacgroundImageView addSubview:blackUIView]; [blackUIView addSubview:blurEffectView]; UIViewPropertyAnimator *animator = [[UIViewPropertyAnimator alloc] initWithDuration:4.f curve:UIViewAnimationCurveLinear animations:^{ [blurEffectView setEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]]; }];
lalu Anda bisa menyetel persen
untuk ios9 Anda bisa menggunakan komponen alpha
sumber
Alpha dari UIVisualEffectView selalu harus 1. Saya rasa Anda bisa mencapai efek dengan menyetel alpha dari warna latar belakang.
Sumber: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIVisualEffectView/index.html
sumber
colorWithAlphaComponent:
metode padaUIColor
instance. Namun, tidak yakin bagaimana cara mencapai efek yang sama dengan mengatur warna latar belakang.Saya membuat uiview yang alpha-nya 0 dan menambahkan blurview sebagai subview dari itu. Jadi saya bisa menyembunyikan / menampilkan atau membulatkan sudutnya dengan animasi.
sumber
Saya berakhir dengan solusi berikut, menggunakan animasi terpisah untuk
UIVisualEffectView
dan isinya. Saya menggunakanviewWithTag()
metode untuk mendapatkan referensi keUIView
dalamUIVisualEffectView
.let blurEffectView = UIVisualEffectView() // Fade in UIView.animateWithDuration(1) { self.blurEffectView.effect = UIBlurEffect(style: .Light) } UIView.animateWithDuration(1) { self.blurEffectView.viewWithTag(1)?.alpha = 1 } // Fade out UIView.animateWithDuration(1) { self.blurEffectView.effect = nil } UIView.animateWithDuration(1) { self.blurEffectView.viewWithTag(1)?.alpha = 0 }
Saya lebih suka animasi tunggal mengubah alfa, tetapi ini menghindari kesalahan dan tampaknya berfungsi dengan baik.
sumber
Saya baru saja mengalami masalah ini dan cara saya mengatasinya adalah dengan menyimpan UIVisualEffectsView di UIView, dan menganimasikan alpha UIView itu.
Ini bekerja dengan baik, hanya saja setelah alpha berubah di bawah 1.0, berubah menjadi putih solid dan tampak sangat menggelegar. Untuk menyiasati ini, Anda harus mengatur properti lapisan UIView
containerView.layer.allowsGroupOpacity = false
dan ini akan mencegahnya berkedip putih.Sekarang Anda dapat menganimasikan masuk / memudarkan UIView yang berisi tampilan efek visual dan subview lainnya menggunakan properti alfa dan tidak perlu khawatir tentang gangguan grafis atau mencatat pesan peringatan.
sumber
_visualEffectView.contentView.alpha = 0;
Untuk mengubah alfa UIVisualEffectView, Anda harus mengubah contentView dari _visualEffectView. Jika Anda mengubah alfa _visualEffectView, Anda akan mendapatkan ini
<UIVisualEffectView 0x7ff7bb54b490> is being asked to animate its opacity. This will cause the effect to appear broken until opacity returns to 1.
sumber
Biasanya, saya hanya ingin menganimasikan buram saat menampilkan pengontrol tampilan di atas layar dan ingin mengaburkan pengontrol tampilan presentasi. Berikut adalah ekstensi yang menambahkan blur () dan unblur () ke pengontrol tampilan untuk memfasilitasi itu:
extension UIViewController { func blur() { // Blur out the current view let blurView = UIVisualEffectView(frame: self.view.frame) self.view.addSubview(blurView) UIView.animate(withDuration:0.25) { blurView.effect = UIBlurEffect(style: .light) } } func unblur() { for childView in view.subviews { guard let effectView = childView as? UIVisualEffectView else { continue } UIView.animate(withDuration: 0.25, animations: { effectView.effect = nil }) { didFinish in effectView.removeFromSuperview() } } } }
Anda tentu saja dapat membuatnya lebih kuat dengan membiarkan pengguna memilih gaya efek, memodifikasi durasi, memanggil sesuatu ketika animasi selesai, memberi tag pada tampilan efek visual yang ditambahkan dalam blur () untuk memastikan itu satu-satunya yang dihapus ketika Anda menghapus blur ( ), dll., tetapi sejauh ini saya belum merasa perlu melakukan hal-hal ini, karena ini cenderung menjadi jenis operasi "tembak dan lupakan".
sumber
berdasarkan jawaban @ cc, saya memodifikasi ekstensinya untuk mengaburkan tampilan
sumber
Meningkatkan respon @ Tel4tel dan @cc, berikut adalah ekstensi dengan parameter dan penjelasan singkat.
extension UIView { // Perform a blur animation in the whole view // Effect tone can be .light, .dark, .regular... func blur(duration inSeconds: Double, effect tone: UIBlurEffectStyle) { let blurView = UIVisualEffectView(frame: self.bounds) self.addSubview(blurView) UIView.animate(withDuration: inSeconds) { blurView.effect = UIBlurEffect(style: tone) } } // Perform an unblur animation in the whole view func unblur(duration inSeconds: Double) { for childView in subviews { guard let effectView = childView as? UIVisualEffectView else { continue } UIView.animate(withDuration: inSeconds, animations: { effectView.effect = nil }){ didFinish in effectView.removeFromSuperview() } } } }
Kemudian Anda dapat menggunakannya seperti:
view.blur(duration: 5.0, effect: .light)
atauview.unblur(duration: 3.0)
Ingatlah untuk TIDAK menggunakannya
viewDidLoad()
karena akan menimpa animasi. Selain itu, saat menjalankan Simulator, putar grafik ke tingkat Lebih Tinggi agar dapat melihat animasi (Debug> Penimpaan Kualitas Grafik> Kualitas Tinggi).sumber