Vista desenfocada estilo iOS 7

¿Alguien sabe de algún control que replique las vistas de desenfoque del estilo iOS7?

Supongo que puede haber algún tipo de subclase UIView que replique el comportamiento.

Estoy hablando de estas vistas de tipo que difuminan el fondo de forma extremadamente gruesa para que tengan efectos de extracción desde la vista de fondo.

enter image description here

Es posible que pueda modificar algo como RWBlurPopover de Bin Zhang para hacer esto. Ese componente usa mi GPUImage para aplicar un desenfoque Gaussiano a los componentes que se encuentran debajo de él, pero con la misma facilidad podría usar un CIGaussianBlur. GPUImage podría ser un cabello más rápido sin embargo .

Sin embargo, ese componente depende de que pueda capturar la vista detrás del que está presentando y puede tener problemas con las vistas que se animan detrás de este contenido. La necesidad de realizar un viaje a través de Core Graphics para rasterizar la vista de fondo ralentizará las cosas, por lo que probablemente no tengamos acceso suficientemente directo para poder hacer esto de manera efectiva para las superposiciones en la animación de vistas.

Como una actualización de lo anterior, recientemente reelaboré las faltas de definición en GPUImage para admitir radios variables, lo que permite la replicación completa del tamaño de desenfoque en la vista del centro de control de iOS 7. A partir de eso, creé la clase GPUImageiOS7BlurFilter que encapsula el correcto tamaño de desenfoque y corrección de color que Apple parece estar usando aquí. Así es como el desenfoque de GPUImage (a la derecha) se compara con el desenfoque incorporado (a la izquierda):

Desenfoque de AppleDesenfoque de GPUImage

Utilizo un muestreo / submuestreo de 4X para reducir el número de píxeles sobre los que debe funcionar el desenfoque gaussiano, por lo que un iPhone 4S puede difuminar toda la pantalla en aproximadamente 30 ms con esta operación.

Todavía tiene el desafío de cómo extraer contenido de este desenfoque desde puntos de vista que se encuentran detrás de este en forma performante.

Estoy usando FXBlurView que funciona muy bien en iOS5 +

https://github.com/nicklockwood/FXBlurView

CocoaPods:

 -> FXBlurView (1.3.1) UIView subclass that replicates the iOS 7 realtime background blur effect, but works on iOS 5 and above. pod 'FXBlurView', '~> 1.3.1' - Homepage: http://github.com/nicklockwood/FXBlurView - Source: https://github.com/nicklockwood/FXBlurView.git - Versions: 1.3.1, 1.3, 1.2, 1.1, 1.0 [master repo] 

Lo agregué usando:

 FXBlurView *blurView = [[FXBlurView alloc] initWithFrame:CGRectMake(50, 50, 150, 150)]; [self.blurView setDynamic:YES]; [self.view addSubview:self.blurView]; 

ADVERTENCIA: alguien en los comentarios afirmó que Apple rechaza las aplicaciones que usan esta técnica. Eso NO me pasó a mí, sino solo por su consideración.

Esto puede sorprenderlo, pero puede usar una UIToolbar , que ya incluye ese efecto estándar (solo iOS 7+). En usted ve viewDidLoad del controlador:

 self.view.opaque = NO; self.view.backgroundColor = [UIColor clearColor]; // Be sure in fact that EVERY background in your view's hierarchy is totally or at least partially transparent for a kind effect! UIToolbar *fakeToolbar = [[UIToolbar alloc] initWithFrame:self.view.bounds]; fakeToolbar.autoresizingMask = self.view.autoresizingMask; // fakeToolbar.barTintColor = [UIColor white]; // Customize base color to a non-standard one if you wish [self.view insertSubview:fakeToolbar atIndex:0]; // Place it below everything 

Desde iOS8 puedes usar UIBlurEffect .

Hay buenos ejemplos en iOS8Sampler con UIBlurEffect y UIVibrancyEffect .

La mejor forma nueva de obtener una superposición borrosa es usar la nueva característica de iOS 8 UIVisualEffectView.

 UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; UIVisualEffectView *bluredView = [[UIVisualEffectView alloc] initWithEffect:effect]; bluredView.frame = self.view.bounds; [self.view addSubview:bluredView]; 

UIBlurEffect admite tres tipos de estilo. Oscuro, ligero y extra ligero

Puede crear una clase con una UIToolBar que sea una subclase de UIView y crear una instancia en un controlador de vista separado. Este enfoque demuestra una UIToolBar translúcida (subclasificada por UIView) que proporciona comentarios en tiempo real (en este caso para una sesión AVCapture).

YourUIView.h

 #import  @interface YourUIView : UIView @property (nonatomic, strong) UIColor *blurTintColor; @property (nonatomic, strong) UIToolbar *toolbar; @end 

YourUIView.m

 #import "YourUIView.h" @implementation YourUIView - (instancetype)init { self = [super init]; if (self) { [self setup]; } return self; } - (void)setup { // If we don't clip to bounds the toolbar draws a thin shadow on top [self setClipsToBounds:YES]; if (![self toolbar]) { [self setToolbar:[[UIToolbar alloc] initWithFrame:[self bounds]]]; [self.toolbar setTranslatesAutoresizingMaskIntoConstraints:NO]; [self insertSubview:[self toolbar] atIndex:0]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_toolbar]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(_toolbar)]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_toolbar]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(_toolbar)]]; } } - (void) setBlurTintColor:(UIColor *)blurTintColor { [self.toolbar setBarTintColor:blurTintColor]; } @end 

Una vez que se haya personalizado la UIView anterior, siga adelante y cree una clase que sea una subclase de un ViewController. A continuación, he creado una clase que está utilizando una sesión de AVCapture. Debe utilizar AVCaptureSession para anular la configuración incorporada de la cámara de Apple. Por lo tanto, puede superponer la UIToolBar tranclucente de la clase YourUIView .

YourViewController.h

 #import  @interface YourViewController : UIViewController @property (strong, nonatomic) UIView *frameForCapture; @end 

YourViewController.m

 #import "YourViewController.h" #import  #import "TestView.h" @interface YourViewController () @property (strong, nonatomic) UIButton *displayToolBar; @end @implementation YourViewController AVCaptureStillImageOutput *stillImageOutput; AVCaptureSession *session; - (void) viewWillAppear:(BOOL)animated { session = [[AVCaptureSession alloc] init]; [session setSessionPreset:AVCaptureSessionPresetPhoto]; AVCaptureDevice *inputDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; NSError *error; AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:inputDevice error:&error]; if ([session canAddInput:deviceInput]) { [session addInput:deviceInput]; } AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; [previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; CALayer *rootLayer = [[self view] layer]; [rootLayer setMasksToBounds:YES]; CGRect frame = [[UIScreen mainScreen] bounds]; self.frameForCapture.frame = frame; [previewLayer setFrame:frame]; [rootLayer insertSublayer:previewLayer atIndex:0]; stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil]; [stillImageOutput setOutputSettings:outputSettings]; [session addOutput:stillImageOutput]; [session startRunning]; [self.navigationController setNavigationBarHidden:YES animated:animated]; [super viewWillAppear:animated]; } - (void)viewDidLoad { [super viewDidLoad]; /* Open button */ UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 350, self.view.bounds.size.width, 50)]; [button addTarget:self action:@selector(showYourUIView:) forControlEvents:UIControlEventTouchUpInside]; [button setTitle:@"Open" forState:UIControlStateNormal]; [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; button.backgroundColor = [UIColor greenColor]; [self.view addSubview:button]; UIButton *anotherButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 50, self.view.bounds.size.width, 50)]; [anotherButton addTarget:self action:@selector(showYourUIView:) forControlEvents:UIControlEventTouchUpInside]; [anotherButton setTitle:@"Open" forState:UIControlStateNormal]; [anotherButton setTitleColor:[UIColor greenColor] forState:UIControlStateNormal]; anotherButton.backgroundColor = [UIColor redColor]; [self.view addSubview:anotherButton]; } - (void) showYourUIView:(id) sender { TestView *blurView = [TestView new]; [blurView setFrame:self.view.bounds]; [self.view addSubview:blurView]; } @end