Cómo configurar BlurRadius de UIBlurEffectStyle.Light

Resuelto Miaperolla asked hace 10 años • 0 respuestas

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.hefecto 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)
}
Miaperolla avatar Aug 27 '14 21:08 Miaperolla
Aceptado

Cambiar alfa no es una solución perfecta. No afecta la intensidad del desenfoque. Puede configurar una animación desde nilel 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

Darrarski avatar Nov 24 '2017 14:11 Darrarski

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.

Kwalker108 avatar Aug 08 '2015 16:08 Kwalker108

Aunque es un truco y probablemente no será aceptado en la tienda de aplicaciones, aún es posible. Tienes que subclasificar algo UIBlurEffectasí:

#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 MyBlurEffectclass en lugar de UIBlurEffectcuando cree su efecto para UIVisualEffectView.

Eugene Dudnyk avatar Jun 09 '2015 23:06 Eugene Dudnyk

BluuurBiblioteca desarrollada recientemente para cambiar dinámicamente el radio de desenfoque UIVisualEffectsViewsin utilizar ninguna API privada: https://github.com/ML-Works/Bluuur

Utiliza una animación pausada de la configuración effectpara 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 .effectla propiedad de UIVisualEffectsView. Espero que la comunidad pueda volver a portar esta funcionalidad a la versión anterior de iOS.

k06a avatar Jun 03 '2016 11:06 k06a