Я хочу, чтобы UIVisualEffectsView исчезал с помощью UIBlurEffect:
var blurEffectView = UIVisualEffectView()
blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
Я использую обычную анимацию в функции, вызываемой a, UIButton
чтобы ее усилить, то же самое для затухания, но .alpha = 0
& hidden = true
:
blurEffectView.hidden = false
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut) {
self.blurEffectView.alpha = 1
}
Теперь, замирание в обоих направлениях делает работу , но он дает мне ошибку , когда замирание из :
<UIVisualEffectView 0x7fdf5bcb6e80>
просят оживить его непрозрачность. Это приведет к тому, что эффект будет прерывистым, пока непрозрачность не вернется к 1.
Вопрос
Как мне успешно увеличивать UIVisualEffectView
и уменьшать появление и исчезновение , не нарушая его и не имея перехода затухания?
Заметка
- Пока я пытался положить
UIVisualEffectView
вUIView
и исчезать , что один, не успех
ios
swift
fade
uiblureffect
uivisualeffectview
ЛинусГеффарт
источник
источник
Ответы:
Я думаю, что это новое в iOS9, но теперь вы можете установить эффект
UIVisualEffectView
внутри блока анимации:let overlay = UIVisualEffectView() // Put it somewhere, give it a frame... UIView.animate(withDuration: 0.5) { overlay.effect = UIBlurEffect(style: .light) }
Установите
nil
для удаления.ОЧЕНЬ ВАЖНО - При тестировании этого на симуляторе убедитесь, что для параметра «Переопределение качества графики» симулятора установлено значение «Высокое качество», чтобы это работало.
источник
В документации Apple (в настоящее время) говорится ...
а также
Я считаю, что здесь отсутствует какой-то важный контекст ...
Я бы предположил, что цель состоит в том, чтобы избежать значений альфа, которые меньше 1 для постоянного представления. По моему скромному мнению, это не относится к анимации вида.
Моя точка зрения - я бы предположил, что для анимации приемлемы альфа-значения меньше 1.
В терминальном сообщении говорится:
Читая это тщательно, то эффект будет казаться разбиться. Мои соображения по этому поводу:
UIVisualEffect
представление с альфа-значением меньше 1 не будет отображаться так, как задумано / разработано Apple; а такжеЧтобы расширить ответ @ jrturton выше, который помог мне решить мою проблему, я бы добавил ...
Чтобы скрыть
UIVisualEffect
использование следующего кода (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() } )
Я успешно использую оба метода: устанавливаю
effect
свойствоnil
и устанавливаюalpha
свойство на0
.Обратите внимание , что установка
effect
дляnil
создает «хорошую вспышку» (за неимением лучшего описания) в конце анимации, при этом установивalpha
в0
создающих плавного перехода.(Сообщите мне о любых синтаксических ошибках ... Я пишу в obj-c.)
источник
Вот решение, которое я нашел, которое работает как на iOS10, так и на более ранних версиях с использованием 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 } } } }
Вы также можете проверить эту суть, чтобы найти пример использования.
источник
UIViewPropertyAnimator
- единственное, что работает в iOS 11. Спасибо за это!Просто обходной путь - поместите
UIVisualEffectView
в представление контейнера и изменитеalpha
свойство для этого контейнера. Этот подход отлично работает у меня на iOS 9. Кажется, он больше не работает в iOS 10.источник
Вы можете изменить альфа-канал представления визуальных эффектов без каких-либо проблем, кроме предупреждения в консоли. Вид может выглядеть просто частично прозрачным, а не размытым. Но обычно это не проблема, если вы просто меняете альфа во время анимации.
Ваше приложение не выйдет из строя или будет отклонено из-за этого. Протестируйте на реальном устройстве (или восьмерке). Если вам нравится, как он выглядит и работает, ничего страшного. Apple просто предупреждает вас, что он может не выглядеть или работать так же хорошо, как представление визуальных эффектов с альфа-значением 1.
источник
Вы можете сделать снимок статического основного вида и затемнить его, не затрагивая прозрачность размытого вида. Предполагая 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() } ) }
источник
Если вы хотите исчезнуть в UIVisualEffectView - для ios10 используйте 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]]; }];
тогда вы можете установить процент
для ios9 вы можете использовать альфа-компонент
источник
Альфа UIVisualEffectView всегда должна быть 1. Я думаю, вы можете добиться этого эффекта, установив альфа цвета фона.
Источник: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIVisualEffectView/index.html
источник
colorWithAlphaComponent:
метод дляUIColor
экземпляров. Однако не знаю, как добиться того же эффекта с помощью настройки цвета фона.Я делаю uiview, альфа которого равна 0, и добавляю размытие в качестве subview этого. Так что я могу скрыть / показать или закруглить углы с помощью анимации.
источник
В итоге я пришел к следующему решению, используя отдельные анимации для
UIVisualEffectView
содержимого и содержимого. Я использовал этотviewWithTag()
метод, чтобы получить ссылку наUIView
внутреннюю частьUIVisualEffectView
.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 }
Я бы предпочел одиночную анимацию, меняющую альфу, но это позволяет избежать ошибки и, похоже, работает так же хорошо.
источник
У меня только что возникла эта проблема, и я решил ее обойти: разместить UIVisualEffectsView в UIView и оживить альфа-канал UIView.
Это сработало хорошо, за исключением того, что как только альфа изменилась ниже 1.0, она превратилась в сплошной белый цвет и выглядела очень неприятно. Чтобы обойти это, вы должны установить свойство слоя UIView
containerView.layer.allowsGroupOpacity = false
и это предотвратит его мигание белым.Теперь вы можете анимировать / исчезать UIView, содержащий представление визуальных эффектов и любые другие подвиды, используя его свойство alpha, и вам не нужно беспокоиться о каких-либо графических сбоях или регистрации предупреждающего сообщения.
источник
_visualEffectView.contentView.alpha = 0;
Чтобы изменить альфа-канал UIVisualEffectView, вы должны изменить contentView для _visualEffectView. Если вы измените альфа-канал для _visualEffectView, вы получите следующее
<UIVisualEffectView 0x7ff7bb54b490> is being asked to animate its opacity. This will cause the effect to appear broken until opacity returns to 1.
источник
Обычно я хочу анимировать размытие только тогда, когда я представляю контроллер представления над экраном и хочу размыть представляющий контроллер представления. Вот расширение, которое добавляет Blur () и unblur () к контроллеру представления, чтобы облегчить это:
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() } } } }
Вы, конечно, можете сделать это более надежным, позволив пользователю выбирать стиль эффекта, изменять продолжительность, вызывать что-то, когда анимация завершена, отмечать добавленное представление визуального эффекта в blur (), чтобы убедиться, что он единственный удаляется, когда вы снимаете размытие ( ) и т. д., но я пока не обнаружил необходимости в этом, поскольку это, как правило, операция типа «выстрелил и забыл».
источник
на основе ответа @cc я изменил его расширение, чтобы размыть представление
источник
Улучшение ответа @ Tel4tel и @cc, вот расширение с параметрами и кратким объяснением.
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() } } } }
Тогда вы можете использовать это как:
view.blur(duration: 5.0, effect: .light)
илиview.unblur(duration: 3.0)
Не забудьте НЕ использовать его, так
viewDidLoad()
как он переопределит анимацию. Кроме того, при работе на симуляторе переключите графику на более высокий уровень, чтобы увидеть анимацию («Отладка»> «Переопределение качества графики»> «Высокое качество»).источник