Quiero desvanecer un UIVisualEffectsView con un UIBlurEffect dentro y fuera:
var blurEffectView = UIVisualEffectView()
blurEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
Utilizo una animación normal dentro de una función llamada por a UIButton
para fundirla, lo mismo para desaparecer pero .alpha = 0
& hidden = true
:
blurEffectView.hidden = false
UIView.animate(withDuration: 1, delay: 0, options: .curveEaseOut) {
self.blurEffectView.alpha = 1
}
Ahora, la decoloración en ambas direcciones funciona pero me da un error cuando la decoloración a cabo :
<UIVisualEffectView 0x7fdf5bcb6e80>
se le pide que anime su opacidad. Esto hará que el efecto parezca roto hasta que la opacidad vuelva a 1.
Pregunta
¿Cómo puedo desvanecer la entrada UIVisualEffectView
y la salida sin romperla y tener una transición de desvanecimiento?
Nota
- Traté de poner el
UIVisualEffectView
enUIView
ay desvanecer ese, sin éxito
ios
swift
fade
uiblureffect
uivisualeffectview
LinusGeffarth
fuente
fuente
Respuestas:
Creo que esto es nuevo en iOS9, pero ahora puedes establecer el efecto de un
UIVisualEffectView
bloque de animación dentro de un:Configúrelo en
nil
para eliminar.MUY IMPORTANTE: cuando pruebe esto en el simulador, asegúrese de configurar la Anulación de calidad de gráficos de su simulador en Alta calidad para que esto funcione.
fuente
La documentación de Apple (actualmente) dice ...
y
Creo que aquí falta un contexto importante ...
Sugeriría que la intención es evitar valores alfa inferiores a 1 para una vista persistente. En mi humilde opinión, esto no se aplica a la animación de una vista.
Mi punto: sugeriría que los valores alfa inferiores a 1 son aceptables para las animaciones.
El mensaje del terminal dice:
Al leer esto con atención, el efecto parecerá estar roto. Mis puntos sobre este ser:
UIVisualEffect
con un valor alfa inferior a 1 no se presentará según lo previsto / diseñado por Apple; yPara extender la respuesta de @jrturton anterior que me ayudó a resolver mi problema, agregaría ...
Para atenuar el
UIVisualEffect
uso del siguiente código (Objective-C):Utilizo con éxito ambos métodos: estableciendo la
effect
propiedad ennil
y estableciendo laalpha
propiedad en0
.Tenga en cuenta que al configurar el
effect
paranil
crear un "flash agradable" (a falta de una mejor descripción) al final de la animación, mientras que el establecer elalpha
para0
crea una transición suave.(Avíseme cualquier error de sintaxis ... escribo en obj-c.)
fuente
Aquí está la solución que terminé y que funciona tanto en iOS10 como en versiones anteriores con Swift 3
También puede consultar esta esencia para encontrar un uso de ejemplo.
fuente
UIViewPropertyAnimator
es lo único que parece funcionar en iOS 11. ¡Gracias por esto!Solo una solución: colóquelo
UIVisualEffectView
en una vista de contenedor y cambie laalpha
propiedad de ese contenedor. Ese enfoque me funciona perfectamente en iOS 9. Parece que ya no funciona en iOS 10.fuente
Puede cambiar el alfa de la vista de efectos visuales sin ningún problema, aparte de la advertencia en la consola. La vista puede parecer simplemente parcialmente transparente, en lugar de borrosa. Pero esto generalmente no es un problema si solo está cambiando el alfa durante la animación.
Su aplicación no se bloqueará ni será rechazada por esto. Pruébelo en un dispositivo real (u ocho). Si está satisfecho con su apariencia y rendimiento, está bien. Apple solo le advierte que es posible que no se vea o no funcione tan bien como una vista de efectos visuales con un valor alfa de 1.
fuente
Puede tomar una instantánea de una vista subyacente estática y hacerla aparecer y desaparecer sin tocar la opacidad de la vista borrosa. Suponiendo un ivar de blurView:
fuente
Si desea desvanecerse en su UIVisualEffectView - para ios10 use UIViewPropertyAnimator
entonces puedes establecer el porcentaje
para ios9 puedes usar el componente alfa
fuente
El alfa de UIVisualEffectView siempre tiene que ser 1. Creo que puede lograr el efecto configurando el alfa del color de fondo.
Fuente: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIVisualEffectView/index.html
fuente
colorWithAlphaComponent:
método en lasUIColor
instancias. Sin embargo, no estoy seguro de cómo lograr el mismo efecto con la configuración del color de fondo.Hago una vista de usuario que alfa es 0 y agrego vista borrosa como subvista de eso. Entonces puedo ocultar / mostrar o redondear las esquinas con animación.
fuente
Terminé con la siguiente solución, usando animaciones separadas para
UIVisualEffectView
y el contenido. Usé elviewWithTag()
método para obtener una referencia alUIView
interior delUIVisualEffectView
.Preferiría que la animación única cambiara el alfa, pero esto evita el error y parece funcionar igual de bien.
fuente
Acabo de tener este problema y la forma en que lo resolví fue albergar UIVisualEffectsView en una UIView y animar el alfa de esa UIView.
Esto funcionó bien, excepto que tan pronto como el alfa cambió por debajo de 1.0 se convirtió en un blanco sólido y se veía muy discordante. Para evitar esto, debe establecer la propiedad de capa de UIView
containerView.layer.allowsGroupOpacity = false
y esto evitará que parpadee en blanco.Ahora puede animar dentro / fuera de la UIView que contiene la vista de efectos visuales y cualquier otra subvista usando su propiedad alfa y no tener que preocuparse por fallas gráficas o por registrar un mensaje de advertencia.
fuente
Para cambiar el alfa de UIVisualEffectView, debe cambiar el contentView de _visualEffectView. Si cambia el alfa de _visualEffectView, obtendrá esto
fuente
Por lo general, solo quiero animar un desenfoque cuando estoy presentando un controlador de vista sobre la pantalla y quiero desenfocar el controlador de vista de presentación. Aquí hay una extensión que agrega desenfoque () y unblur () a un controlador de vista para facilitar eso:
Por supuesto, puede hacer esto más robusto permitiendo que el usuario elija el estilo del efecto, modifique la duración, llame a algo cuando se complete la animación, etiquete la vista de efecto visual agregado en desenfoque () para asegurarse de que sea el único que se elimine al desenfocar () ), etc., pero no he encontrado la necesidad de hacer estas cosas hasta ahora, ya que tiende a ser un tipo de operación de "disparar y olvidar".
fuente
basado en la respuesta de @ cc modifiqué su extensión para difuminar una vista
fuente
Mejorando la respuesta de @ Tel4tel y @cc, aquí hay una extensión con parámetros y una breve explicación.
Entonces puedes usarlo como:
view.blur(duration: 5.0, effect: .light)
oview.unblur(duration: 3.0)
Recuerde NO usarlo
viewDidLoad()
ya que anulará la animación. Además, cuando se ejecuta en un simulador, cambie los gráficos al nivel superior para poder ver la animación (Depurar> Anulación de calidad de gráficos> Alta calidad).fuente