web-dev-qa-db-fra.com

Comment appliquer le flou à un UIView?

En ce moment, je construis une application iPhone qui nécessite de brouiller tout UIView. Comment puis-je atteindre cet objectif? J'ai vu ce cadre , mais je ne pense pas que cela fonctionne avec UIView. Existe-t-il un autre moyen de brouiller UIView?

UPDATE: vérifiez la réponse mise à jour ci-dessous, ce qui ajoute plus de pertinence avec l'avènement de iOS 7 et iOS 8.

44
virindh

Depuis la sortie d'iOS 7, cette question a eu beaucoup de succès et j'ai pensé que je devrais faire un suivi sur ce que j'ai fini par faire.

Personnellement, j’ai rendu la photo floue à l’époque avec photoshop, mais il existe de très bonnes bibliothèques tierces disponibles qui font dynamic et static floues, voici une couple:

Je voulais poster ceci parce que vous n'avez plus besoin de prendre des captures d'écran de cadres ou d'écrans individuels.

iOS 8: Avec la prochaine version d'iOS 8, Apple a intégré un UIView, UIVisualEffectView flou intégré ( https://developer.Apple.com/documentation/uikit/uivisualeffectview )

28
virindh

Cela devrait marcher. J'ai commenté dans le code pour vous aider à comprendre ce qui se passe:

//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 vous avez des questions sur le code, laissez-le dans les commentaires.

Remarque: CIGaussianBlur n'est pas présent sur iOS à partir de la version 5.1, vous devez donc trouver un moyen différent de rendre la vue floue pour les appareils 5.x + (Merci à @BradLarson pour cette astuce). La réponse acceptée dans cette question semble prometteuse comme solution de remplacement, tout comme cette bibliothèque .

47
pasawaya

Dans iOS 8, vous pouvez utiliser UIVisualEffectView pour obtenir des vues floues ..__ Voir: https://developer.Apple.com/documentation/uikit/uivisualeffectview

11
Robert

Simplement résolu en utilisant ce code.

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];
1
Yano Ratheez

Le moyen le plus simple de rendre une vue floue consiste à ajouter UIToolbar, il suffit de modifier la valeur alpha pour modifier le flou.

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
YaBoiSandeep