Cómo configurar BlurRadius de UIBlurEffectStyle.Light
Me preguntaba cómo configurar el factor de radio/desenfoque de iOS nuevo UIBlurEffectStyle.Light
. No pude encontrar nada en la documentación. Pero quiero que se parezca al clásico UIImage+ImageEffects.h
efecto de desenfoque.
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let blur = UIBlurEffect(style: UIBlurEffectStyle.Light)
let effectView = UIVisualEffectView(effect: blur)
effectView.frame = frame
addSubview(effectView)
}
Cambiar alfa no es una solución perfecta. No afecta la intensidad del desenfoque. Puede configurar una animación desde nil
el efecto de desenfoque objetivo y configurar manualmente el desplazamiento de tiempo para obtener la intensidad de desenfoque deseada. Desafortunadamente, iOS restablecerá el desplazamiento de la animación cuando la aplicación regrese del fondo.
Afortunadamente, existe una solución sencilla que funciona en iOS >= 10. Puedes utilizar UIViewPropertyAnimator
. No noté ningún problema al usarlo. Mantengo la intensidad del desenfoque personalizado cuando la aplicación regresa del fondo. Así es como puedes implementarlo:
class CustomIntensityVisualEffectView: UIVisualEffectView {
/// Create visual effect view with given effect and its intensity
///
/// - Parameters:
/// - effect: visual effect, eg UIBlurEffect(style: .dark)
/// - intensity: custom intensity from 0.0 (no effect) to 1.0 (full effect) using linear scale
init(effect: UIVisualEffect, intensity: CGFloat) {
super.init(effect: nil)
animator = UIViewPropertyAnimator(duration: 1, curve: .linear) { [unowned self] in self.effect = effect }
animator.fractionComplete = intensity
}
required init?(coder aDecoder: NSCoder) {
fatalError()
}
// MARK: Private
private var animator: UIViewPropertyAnimator!
}
También creé una esencia: https://gist.github.com/darrarski/29a2a4515508e385c90b3ffe6f975df7
Puede cambiar el alfa de UIVisualEffectView al que agrega su efecto de desenfoque.
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.alpha = 0.5
blurEffectView.frame = self.view.bounds
self.view.addSubview(blurEffectView)
Esta no es una verdadera solución, ya que en realidad no cambia el radio del desenfoque, pero he descubierto que hace el trabajo con muy poco trabajo.
Aunque es un truco y probablemente no será aceptado en la tienda de aplicaciones, aún es posible. Tienes que subclasificar algo UIBlurEffect
así:
#import <objc/runtime.h>
@interface UIBlurEffect (Protected)
@property (nonatomic, readonly) id effectSettings;
@end
@interface MyBlurEffect : UIBlurEffect
@end
@implementation MyBlurEffect
+ (instancetype)effectWithStyle:(UIBlurEffectStyle)style
{
id result = [super effectWithStyle:style];
object_setClass(result, self);
return result;
}
- (id)effectSettings
{
id settings = [super effectSettings];
[settings setValue:@50 forKey:@"blurRadius"];
return settings;
}
- (id)copyWithZone:(NSZone*)zone
{
id result = [super copyWithZone:zone];
object_setClass(result, [self class]);
return result;
}
@end
Aquí el radio de desenfoque se establece en 50. Puede cambiar 50 a cualquier valor que necesite.
Luego simplemente use MyBlurEffect
class en lugar de UIBlurEffect
cuando cree su efecto para UIVisualEffectView
.
Bluuur
Biblioteca desarrollada recientemente para cambiar dinámicamente el radio de desenfoque UIVisualEffectsView
sin utilizar ninguna API privada: https://github.com/ML-Works/Bluuur
Utiliza una animación pausada de la configuración effect
para lograr un radio de desenfoque cambiante. Solución basada en esta esencia: https://gist.github.com/n00neimp0rtant/27829d87118d984232a4
Y la idea principal es:
// Freeze animation
blurView.layer.speed = 0;
blurView.effect = nil;
[UIView animateWithDuration:1.0 animations:^{
blurView.effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
}];
// Set animation progress from 0 to 1
blurView.layer.timeOffset = 0.5;
ACTUALIZAR:
Apple introdujo la clase UIViewPropertyAnimator en iOS 10. Eso es exactamente lo que necesitamos para animar .effect
la propiedad de UIVisualEffectsView
. Espero que la comunidad pueda volver a portar esta funcionalidad a la versión anterior de iOS.