2012-06-21 16 views
43

Ahora mismo estoy construyendo una aplicación para iPhone que requiere difuminar una UIView completa. ¿Cómo puedo conseguir esto? He visto this framework, pero no creo que eso funcione con UIView. ¿Hay alguna manera alternativa de difuminar una UIView?¿Cómo aplicar el desenfoque a un UIView?

ACTUALIZACIÓN: Verificar si mi respuesta actualizada a continuación, la adición de más relevancia con la llegada de iOS 7 y 8. iOS

Respuesta

27

Desde el lanzamiento de iOS 7, esta pregunta ha recibido muchos golpes y pensé que debería hacer un seguimiento de lo que terminé haciendo.

personalmente borrosa la imagen en el momento con el photoshop, pero hay muchas bibliotecas grandes de terceros disponibles que dinámica y estática desenfoque, aquí hay un par:

yo quería publicar esto porque yo ya no es necesita para tomar capturas de pantalla de marcos o pantallas individuales.

iOS 8: Con la llegada lanzamiento de iOS 8, Apple ha incluido construido en un UIView borrosa, UIVisualEffectView (https://developer.apple.com/documentation/uikit/uivisualeffectview)

+0

FXBlurView funciona en iOS5 + [https://github.com/nicklockwood/FXBlurView](https://github.com/nicklockwood/FXBlurView). –

+0

Tenga en cuenta que se rechazó al menos una aplicación al usar algunas de estas bibliotecas (iOS-blur https://github.com/JagCesar/iOS-blur/issues/25). Estas bibliotecas usan una capa dentro de 'UITabBar' para lograr el efecto, y Apple parece rechazarlas. – pgb

+1

Esto parece haberse corregido con un nuevo compromiso. Además, la aplicación que fue rechazada fue rechazada por otra razón (principal). – virindh

47

Esto debería funcionar. Comenté en el código para ayudarle a entender lo que está pasando:

//To take advantage of CIFilters, you have to import the Core Image framework 
#import <CoreImage/CoreImage.h> 

//Get a UIImage from the UIView 
UIGraphicsBeginImageContext(myView.bounds.size); 
[myView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

//Blur the UIImage with a CIFilter 
CIImage *imageToBlur = [CIImage imageWithCGImage:viewImage.CGImage];  
CIFilter *gaussianBlurFilter = [CIFilter filterWithName: @"CIGaussianBlur"]; 
[gaussianBlurFilter setValue:imageToBlur forKey: @"inputImage"]; 
[gaussianBlurFilter setValue:[NSNumber numberWithFloat: 10] forKey: @"inputRadius"]; 
CIImage *resultImage = [gaussianBlurFilter valueForKey: @"outputImage"]; 
UIImage *endImage = [[UIImage alloc] initWithCIImage:resultImage]; 

//Place the UIImage in a UIImageView 
UIImageView *newView = [[UIImageView alloc] initWithFrame:self.view.bounds]; 
newView.image = endImage; 
[self.view addSubview:newView]; 

Si usted tiene alguna pregunta sobre el código, simplemente dejarlo en los comentarios.

Nota: CIGaussianBlur no está presente en iOS como de 5,1, por lo que debe encontrar una manera diferente a difuminar la vista de dispositivos 5.x + (Gracias a @BradLarson por este consejo). La respuesta aceptada en this question parece prometedora como reemplazo, al igual que this library.

+10

Tenga en cuenta que CIGaussianBlur no está presente en iOS a partir de 5.1, por lo que es posible que deba encontrar una forma diferente de lograr esto en 5.xy en versiones anteriores. –

+0

Obtienes la imagen borrosa entre self.view y myView en este código, ¿verdad? –

+0

Hola @qegal, ¿cómo puedo cambiar la intensidad del efecto blurr? –

0

La forma más sencilla de difuminar una vista es agregar UIToolbar, simplemente cambie el valor alfa para cambiar el desenfoque.

self.toolbar = [[UIToolbar alloc]initForAutoLayout]; 
[self.view addSubview:self.toolbar]; 
[self.toolbar autoPinEdgeToSuperviewEdge:ALEdgeLeft withInset:0]; 
[self.toolbar autoPinEdgeToSuperviewEdge:ALEdgeRight withInset:0]; 
[self.toolbar autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:NAVBAR_HEIGHT]; 
[self.toolbar autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:0]; 
self.toolbar.alpha = 0.5; 
+0

Esto se discute dentro de la respuesta aceptada. Sin embargo, esto ya no es eficiente (o desaconseja) con el lanzamiento de iOS 8 y UIVisualEffect Classes y API's – virindh

+0

. Entonces podemos usar UIToolbar como una vista borrosa para ios7, sin usar ninguna biblioteca de terceros. – YaBoiSandeep

1

Simplemente resuelto usando este código.

UIToolbar *toolBar = [[UIToolbar alloc]initWithFrame:yourView.bounds]; 
toolBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 7.0) { 
    toolBar.barTintColor = nil; 
    toolBar.translucent = YES; 
    toolBar.barStyle = UIBarStyleBlack; 
} 
else 
    [toolBar setTintColor:[UIColor colorWithRed:5 green:31 blue:75 alpha:1]]; 
[yourView insertSubview:toolBar atIndex:0]; 
Cuestiones relacionadas