Création d'une vue de superposition floue
dans L'application musicale de la nouvelle iOS, on peut voir une pochette d'album Derrière une vue qui la brouille.
comment une telle chose peut-elle être accomplie? J'ai lu la documentation, mais ne trouve rien.
20 réponses
Vous pouvez utiliser UIVisualEffectView
pour obtenir cet effet. Il s'agit d'une API native qui a été peaufiné pour la performance et la grande durée de vie de la batterie, plus il est facile à mettre en œuvre.
Swift:
//only apply the blur if the user hasn't disabled transparency effects
if !UIAccessibilityIsReduceTransparencyEnabled() {
view.backgroundColor = .clear
let blurEffect = UIBlurEffect(style: .dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
//always fill the view
blurEffectView.frame = self.view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(blurEffectView) //if you have more UIViews, use an insertSubview API to place it where needed
} else {
view.backgroundColor = .black
}
Objectif-C:
//only apply the blur if the user hasn't disabled transparency effects
if (!UIAccessibilityIsReduceTransparencyEnabled()) {
self.view.backgroundColor = [UIColor clearColor];
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
//always fill the view
blurEffectView.frame = self.view.bounds;
blurEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:blurEffectView]; //if you have more UIViews, use an insertSubview API to place it where needed
} else {
self.view.backgroundColor = [UIColor blackColor];
}
si vous présentez ce contrôleur de vue modalement pour brouiller le contenu sous-jacent, vous aurez besoin de définir le style de présentation modale à Sur le contexte actuel et définir la couleur de fond à effacer pour s'assurer que le contrôleur de vue sous-jacent restera visible une fois que cela est présenté overtop.
Image
puisque cette image dans la capture d'écran est statique, vous pouvez utiliser CIGaussianBlur
de L'Image de base (Nécessite iOS 6). Voici l'échantillon: https://github.com/evanwdavis/Fun-with-Masks/blob/master/Fun%20with%20Masks/EWDBlurExampleVC.m
attention, c'est plus lent que les autres options sur cette page.
#import <QuartzCore/QuartzCore.h>
- (UIImage*) blur:(UIImage*)theImage
{
// ***********If you need re-orienting (e.g. trying to blur a photo taken from the device camera front facing camera in portrait mode)
// theImage = [self reOrientIfNeeded:theImage];
// create our blurred image
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage];
// setting up Gaussian Blur (we could use one of many filters offered by Core Image)
CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:15.0f] forKey:@"inputRadius"];
CIImage *result = [filter valueForKey:kCIOutputImageKey];
// CIGaussianBlur has a tendency to shrink the image a little,
// this ensures it matches up exactly to the bounds of our original image
CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];
UIImage *returnImage = [UIImage imageWithCGImage:cgImage];//create a UIImage for this function to "return" so that ARC can manage the memory of the blur... ARC can't manage CGImageRefs so we need to release it before this function "returns" and ends.
CGImageRelease(cgImage);//release CGImageRef because ARC doesn't manage this on its own.
return returnImage;
// *************** if you need scaling
// return [[self class] scaleIfNeeded:cgImage];
}
+(UIImage*) scaleIfNeeded:(CGImageRef)cgimg {
bool isRetina = [[[UIDevice currentDevice] systemVersion] intValue] >= 4 && [[UIScreen mainScreen] scale] == 2.0;
if (isRetina) {
return [UIImage imageWithCGImage:cgimg scale:2.0 orientation:UIImageOrientationUp];
} else {
return [UIImage imageWithCGImage:cgimg];
}
}
- (UIImage*) reOrientIfNeeded:(UIImage*)theImage{
if (theImage.imageOrientation != UIImageOrientationUp) {
CGAffineTransform reOrient = CGAffineTransformIdentity;
switch (theImage.imageOrientation) {
case UIImageOrientationDown:
case UIImageOrientationDownMirrored:
reOrient = CGAffineTransformTranslate(reOrient, theImage.size.width, theImage.size.height);
reOrient = CGAffineTransformRotate(reOrient, M_PI);
break;
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
reOrient = CGAffineTransformTranslate(reOrient, theImage.size.width, 0);
reOrient = CGAffineTransformRotate(reOrient, M_PI_2);
break;
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
reOrient = CGAffineTransformTranslate(reOrient, 0, theImage.size.height);
reOrient = CGAffineTransformRotate(reOrient, -M_PI_2);
break;
case UIImageOrientationUp:
case UIImageOrientationUpMirrored:
break;
}
switch (theImage.imageOrientation) {
case UIImageOrientationUpMirrored:
case UIImageOrientationDownMirrored:
reOrient = CGAffineTransformTranslate(reOrient, theImage.size.width, 0);
reOrient = CGAffineTransformScale(reOrient, -1, 1);
break;
case UIImageOrientationLeftMirrored:
case UIImageOrientationRightMirrored:
reOrient = CGAffineTransformTranslate(reOrient, theImage.size.height, 0);
reOrient = CGAffineTransformScale(reOrient, -1, 1);
break;
case UIImageOrientationUp:
case UIImageOrientationDown:
case UIImageOrientationLeft:
case UIImageOrientationRight:
break;
}
CGContextRef myContext = CGBitmapContextCreate(NULL, theImage.size.width, theImage.size.height, CGImageGetBitsPerComponent(theImage.CGImage), 0, CGImageGetColorSpace(theImage.CGImage), CGImageGetBitmapInfo(theImage.CGImage));
CGContextConcatCTM(myContext, reOrient);
switch (theImage.imageOrientation) {
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
CGContextDrawImage(myContext, CGRectMake(0,0,theImage.size.height,theImage.size.width), theImage.CGImage);
break;
default:
CGContextDrawImage(myContext, CGRectMake(0,0,theImage.size.width,theImage.size.height), theImage.CGImage);
break;
}
CGImageRef CGImg = CGBitmapContextCreateImage(myContext);
theImage = [UIImage imageWithCGImage:CGImg];
CGImageRelease(CGImg);
CGContextRelease(myContext);
}
return theImage;
}
Pile flou (Boîte + Gaussien)
- StackBlur ceci implémente un mélange de boîte et de flou gaussien. 7x plus rapide que gaussian Non accéléré, mais pas aussi laid que la boîte floue. Voir une démo dans ici (version Java plugin) ou ici (version JavaScript). Cet algorithme est utilisé dans KDE et Camera+ et d'autres. Il n'utilise pas l'Accélérer Cadre, mais il est rapide.
Accélérer Le Cadre De
-
dans la session" Implementing Engaging UI on iOS "de WWDC 2013 Apple explique comment créer un fond flou (à 14:30), et mentionne une méthode
applyLightEffect
mise en œuvre dans le code échantillon en utilisant Accelerate.Framework. -
GPUImage utilise des shaders OpenGL pour créer des flous dynamiques. Il a plusieurs types de flou: GPUImageBoxBlurFilter, GPUImageFastBlurFilter, GaussianSelectiveBlur, GPUImageGaussianBlurFilter. Il existe même un GPUImageiOSBlurFilter qui "devrait reproduire entièrement l'effet de flou fourni par le panneau de contrôle de iOS 7" ( tweet , article ). L'article est détaillé et instructif.
-(UIImage *)blurryGPUImage:(UIImage *)image withBlurLevel:(NSInteger)blur { GPUImageFastBlurFilter *blurFilter = [GPUImageFastBlurFilter new]; blurFilter.blurSize = blur; UIImage *result = [blurFilter imageByFilteringImage:image]; return result; }
-
à partir de indieambitions.com: Perform a blur using vImage . Algorithme est également utilisé dans iOS-RealTimeBlur .
-
de Nick Lockwood: https://github.com/nicklockwood/FXBlurView L'exemple montre le flou au-dessus d'une vue de rouleau. Il floue avec dispatch_async, puis syncs pour appeler les mises à jour avec UITrackingRunLoopMode de sorte que le flou n'est pas décalé quand UIKit donne plus de priorité au défilement de la vue UIScrollView. Cela est expliqué dans le livre de Nick iOS Core Animation , ce qui est génial.
-
iOS-flou cela prend la couche de flou de L'UIToolbar et le met ailleurs. Apple refusera votre application si vous utilisez cette méthode. Voir https://github.com/mochidev/MDBlurView/issues/4
-
From Evadne blog: LiveFrost: Fast, synchrone UIView Snapshot Convolving . Grand code et un bonne lecture. Quelques idées de ce post:
- utilisez une file d'attente en série pour activer les mises à jour de CADisplayLink.
- réutilise les contextes bitmap à moins que les limites changent.
- dessinez des images plus petites en utilisant -[CALayer renderInContext:] avec un facteur d'échelle de 0,5 F.
d'Autres choses
Andy Matuschak a dit sur Twitter: "vous il y a beaucoup d'endroits où on dirait qu'on le fait en temps réel, c'est statique avec des trucs intelligents."
à doubleencore.com disent-ils "nous avons trouvé qu'un rayon de flou de 10 pt plus une augmentation de 10 pt de la saturation imite le mieux l'effet de flou de iOS 7 dans la plupart des circonstances".
Un coup d'oeil à la privée les en-têtes d'Apple SBFProceduralWallpaperView .
Enfin, ce n'est pas un vrai flou, mais rappelez-vous que vous pouvez définir rasterizationScale pour obtenir une image pixelisée: http://www.dimzzy.com/blog/2010/11/blur-effect-for-uiview /
j'ai décidé d'afficher une version écrite de L'Objectif-C à partir de la réponse acceptée juste pour fournir plus d'options dans cette question..
- (UIView *)applyBlurToView:(UIView *)view withEffectStyle:(UIBlurEffectStyle)style andConstraints:(BOOL)addConstraints
{
//only apply the blur if the user hasn't disabled transparency effects
if(!UIAccessibilityIsReduceTransparencyEnabled())
{
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:style];
UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
blurEffectView.frame = view.bounds;
[view addSubview:blurEffectView];
if(addConstraints)
{
//add auto layout constraints so that the blur fills the screen upon rotating device
[blurEffectView setTranslatesAutoresizingMaskIntoConstraints:NO];
[view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:view
attribute:NSLayoutAttributeTop
multiplier:1
constant:0]];
[view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:view
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0]];
[view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:view
attribute:NSLayoutAttributeLeading
multiplier:1
constant:0]];
[view addConstraint:[NSLayoutConstraint constraintWithItem:blurEffectView
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:view
attribute:NSLayoutAttributeTrailing
multiplier:1
constant:0]];
}
}
else
{
view.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.7];
}
return view;
}
les contraintes peuvent être supprimées si vous voulez incase si vous ne supportez que le mode portrait ou si je n'ajoute qu'un drapeau à cette fonction pour les utiliser ou non..
Je ne pense pas que je suis autorisé à poster le code, mais le post ci-dessus mentionnant le code échantillon WWDC est correct. Voici le lien: https://developer.apple.com/downloads/index.action?name=WWDC%202013
le fichier que vous recherchez est la catégorie sur UIImage, et la méthode est applyighteffect.
comme je l'ai noté ci-dessus dans un commentaire, le flou pomme a saturation et d'autres choses qui se passe en dehors de flou. Un simple flou ne le fera pas... si vous cherchez à imiter leur style.
je pense que la solution la plus facile à cela est d'outrepasser UIToolbar, qui brouille tout derrière elle dans iOS 7. Il est assez sournois, mais il est très simple pour vous de mettre en œuvre, et rapide!
vous pouvez le faire avec n'importe quelle vue, juste en faire une sous-classe de UIToolbar
au lieu de UIView
. Vous pouvez même le faire avec une propriété UIViewController
's view
, par exemple...
1) Créer une nouvelle classe qui est une "sous-classe de" UIViewController
et vérifier la boîte POUR "avec XIB pour interface utilisateur".
2) Sélectionnez la vue et allez à l'inspecteur d'identité dans le panneau de droite (alt-command-3). Remplacer" classe "par UIToolbar
. Allez maintenant à l'attribut inspector (alt-command-4) et changez la couleur "Background" en "Clear Color".
3) Ajouter un subview à la vue principale et le raccorder à un IBOutlet dans votre interface. Appelez-le backgroundColorView
. Il ressemblera à quelque chose comme ceci, comme une catégorie privée dans le fichier implementation ( .m
).
@interface BlurExampleViewController ()
@property (weak, nonatomic) IBOutlet UIView *backgroundColorView;
@end
4) Allez au fichier d'implémentation du contrôleur de vue ( .m
) et changez la méthode -viewDidLoad
, pour regarder comme suit:
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.barStyle = UIBarStyleBlack; // this will give a black blur as in the original post
self.backgroundColorView.opaque = NO;
self.backgroundColorView.alpha = 0.5;
self.backgroundColorView.backgroundColor = [UIColor colorWithWhite:0.3 alpha:1];
}
cela vous donnera une vue gris foncé, qui brouille tout derrière elle. Pas de drôles d'Affaires, pas de flou dans l'image de base, en utilisant tout ce qui est à portée de main fourni par L'OS/SDK.
vous pouvez ajouter cette vue vue du contrôleur vers une autre vue, comme suit:
[self addChildViewController:self.blurViewController];
[self.view addSubview:self.blurViewController.view];
[self.blurViewController didMoveToParentViewController:self];
// animate the self.blurViewController into view
faites-moi savoir si quelque chose n'est pas clair, je serai heureux de vous aider!
Modifier
UIToolbar a été modifié en 7.0.3 Pour donner éventuellement un effet indésirable lors de l'utilisation d'un flou coloré.
nous avons utilisé pour être en mesure de définir la couleur en utilisant barTintColor
, mais si vous avez fait cela avant, vous aurez besoin de définir l'alpha composant à moins de 1. Sinon votre UIToolbar sera de couleur complètement opaque - sans flou.
ceci peut être réalisé comme suit: (en gardant à l'esprit que self
est une sous-classe de UIToolbar
)
UIColor *color = [UIColor blueColor]; // for example
self.barTintColor = [color colorWithAlphaComponent:0.5];
Cela donnera une teinte bleue à la vue floue.
Voici une implémentation rapide de Swift en utilisant CIGaussianBlur:
func blur(image image: UIImage) -> UIImage {
let radius: CGFloat = 20;
let context = CIContext(options: nil);
let inputImage = CIImage(CGImage: image.CGImage!);
let filter = CIFilter(name: "CIGaussianBlur");
filter?.setValue(inputImage, forKey: kCIInputImageKey);
filter?.setValue("\(radius)", forKey:kCIInputRadiusKey);
let result = filter?.valueForKey(kCIOutputImageKey) as! CIImage;
let rect = CGRectMake(radius * 2, radius * 2, image.size.width - radius * 4, image.size.height - radius * 4)
let cgImage = context.createCGImage(result, fromRect: rect);
let returnImage = UIImage(CGImage: cgImage);
return returnImage;
}
réponse acceptée est correcte, mais il y a une étape importante qui manque ici, au cas où cette vue - pour laquelle vous voulez un arrière-plan flou - est présenté en utilisant
[self presentViewController:vc animated:YES completion:nil]
par défaut, cela annulera le flou puisque UIKit supprime la vue du présentateur, que vous êtes en fait en train de brouiller. Pour éviter cette suppression, ajouter cette ligne avant la précédente
vc.modalPresentationStyle = UIModalPresentationOverFullScreen;
ou utiliser un autre Over
style.
OBJECTIF-C
UIVisualEffect *blurEffect;
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
UIVisualEffectView *visualEffectView;
visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
visualEffectView.frame = self.accessImageView.bounds;
[self.accessImageView addSubview:visualEffectView];
SWIFT 3.0
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(blurEffectView)
trouvé par accident, me donne vraiment grand (presque dupliquer avec Apple) résultats et utilise le cadre D'accélération. -- http://pastebin.com/6cs6hsyQ * Pas écrit par moi
func blurBackgroundUsingImage(image: UIImage)
{
var frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
var imageView = UIImageView(frame: frame)
imageView.image = image
imageView.contentMode = .ScaleAspectFill
var blurEffect = UIBlurEffect(style: .Light)
var blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = frame
var transparentWhiteView = UIView(frame: frame)
transparentWhiteView.backgroundColor = UIColor(white: 1.0, alpha: 0.30)
var viewsArray = [imageView, blurEffectView, transparentWhiteView]
for index in 0..<viewsArray.count {
if let oldView = self.view.viewWithTag(index + 1) {
var oldView = self.view.viewWithTag(index + 1)
// Must explicitly unwrap oldView to access its removeFromSuperview() method as of Xcode 6 Beta 5
oldView!.removeFromSuperview()
}
var viewToInsert = viewsArray[index]
self.view.insertSubview(viewToInsert, atIndex: index + 1)
viewToInsert.tag = index + 1
}
}
Apple a fourni une extension pour la classe UIImage appelé UIImage+Imageffects.H. Dans cette classe vous avez les méthodes désirées pour brouiller votre vue
Using Uiimageeffets
pour ceux qui veulent plus de contrôle, vous pouvez utiliser le code échantillon UIImageEffects
D'Apple.
vous pouvez copier le code pour UIImageEffects
de la bibliothèque de développeur D'Apple: flou et teinture une Image
Et voici comment l'appliquer :
#import "UIImageEffects.h"
...
self.originalImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];
Cette réponse est fondée sur Mitja Semolic excellent auparavant répondre . Je l'ai converti en swift 3, j'ai ajouté une explication à ce qui se passe dans coments, j'en ai fait une extension D'un UIViewController pour que n'importe quel VC puisse l'appeler à volonté, j'ai ajouté une vue non-bloquée pour montrer l'application sélective, et j'ai ajouté un bloc d'achèvement pour que le contrôleur de la vue appelant puisse faire ce qu'il veut à l'achèvement du flou.
import UIKit
//This extension implements a blur to the entire screen, puts up a HUD and then waits and dismisses the view.
extension UIViewController {
func blurAndShowHUD(duration: Double, message: String, completion: @escaping () -> Void) { //with completion block
//1. Create the blur effect & the view it will occupy
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
let blurEffectView = UIVisualEffectView()//(effect: blurEffect)
blurEffectView.frame = self.view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
//2. Add the effect view to the main view
self.view.addSubview(blurEffectView)
//3. Create the hud and add it to the main view
let hud = HudView.getHUD(view: self.view, withMessage: message)
self.view.addSubview(hud)
//4. Begin applying the blur effect to the effect view
UIView.animate(withDuration: 0.01, animations: {
blurEffectView.effect = blurEffect
})
//5. Halt the blur effects application to achieve the desired blur radius
self.view.pauseAnimationsInThisView(delay: 0.004)
//6. Remove the view (& the HUD) after the completion of the duration
DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
blurEffectView.removeFromSuperview()
hud.removeFromSuperview()
self.view.resumeAnimationsInThisView()
completion()
}
}
}
extension UIView {
public func pauseAnimationsInThisView(delay: Double) {
let time = delay + CFAbsoluteTimeGetCurrent()
let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, time, 0, 0, 0, { timer in
let layer = self.layer
let pausedTime = layer.convertTime(CACurrentMediaTime(), from: nil)
layer.speed = 0.0
layer.timeOffset = pausedTime
})
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, CFRunLoopMode.commonModes)
}
public func resumeAnimationsInThisView() {
let pausedTime = layer.timeOffset
layer.speed = 1.0
layer.timeOffset = 0.0
layer.beginTime = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
}
}
j'ai confirmé qu'il fonctionne à la fois avec iOS 10.3.1 et ios 11
un complément important à la réponse de @Joey
cela s'applique à une situation où vous voulez présenter un arrière-plan flou UIViewController
avec UINavigationController
.
// suppose you've done blur effect with your presented view controller
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController];
// this is very important, if you don't do this, the blur effect will darken after view did appeared
// the reason is that you actually present navigation controller, not presented controller
// please note it's "OverFullScreen", not "OverCurrentContext"
nav.modalPresentationStyle = UIModalPresentationOverFullScreen;
UIViewController *presentedViewController = [[UIViewController alloc] init];
// the presented view controller's modalPresentationStyle is "OverCurrentContext"
presentedViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;
[presentingViewController presentViewController:nav animated:YES completion:nil];
Profitez-en!
de Xcode vous pouvez le faire facilement. Suivez les étapes de xcode. Drage vue d'effet visuel sur votre uivi ou imageview.
Codage Heureux :)
voici le code Swift 2.0 pour la solution qui a été fournie dans réponse acceptée :
//only apply the blur if the user hasn't disabled transparency effects
if !UIAccessibilityIsReduceTransparencyEnabled() {
self.view.backgroundColor = UIColor.clearColor()
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
//always fill the view
blurEffectView.frame = self.view.bounds
blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
self.view.addSubview(blurEffectView) //if you have more UIViews, use an insertSubview API to place it where needed
} else {
self.view.backgroundColor = UIColor.blackColor()
}
si ajoute une vue floue sombre pour tableView, cela le fera magnifiquement:
tableView.backgroundColor = .clear
let blurEffect = UIBlurEffect(style: .dark)
let blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = tableView.bounds
blurEffectView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
// Assigning blurEffectView to backgroundView instead of addSubview to tableView makes tableView cell not blocked by blurEffectView
tableView.backgroundView = blurEffectView
Personnalisé flou échelle
Vous pouvez essayer UIVisualEffectView
réglage personnalisé
class BlurViewController: UIViewController {
private let blurEffect = (NSClassFromString("_UICustomBlurEffect") as! UIBlurEffect.Type).init()
override func viewDidLoad() {
super.viewDidLoad()
let blurView = UIVisualEffectView(frame: UIScreen.main.bounds)
blurEffect.setValue(1, forKeyPath: "blurRadius")
blurView.effect = blurEffect
view.addSubview(blurView)
}
}
sortie: - pour blurEffect.setValue(1...
& blurEffect.setValue(2..
Swift 4:
pour ajouter un overlay, ou la vue popup, vous pouvez également utiliser la vue conteneur avec laquelle vous obtenez un contrôleur de vue libre (vous obtenez la vue conteneur à partir de la palette d'objet/bibliothèque habituelle)
Suit:
ont une vue (ViewForContainer dans le pic) qui tient cette vue de conteneur, à dim it lorsque le contenu de la vue de conteneur sont affichés. Connecter la sortie à l'intérieur du contrôleur de première vue
cacher cette vue lorsque le 1er VC charge
décroche lorsque le bouton est cliqué entrez la description de l'image ici
pour diminuer cette vue lorsque le contenu de la vue conteneur est affiché, réglez les vues arrière-plan à noir et opacité à 30%
j'ai ajouté une réponse à la création de la vue popview dans une autre question Stackoverflow https://stackoverflow.com/a/49729431/5438240
la réponse Simple est D'Ajouter un sous-vue et de le modifier en alpha.
UIView *mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
UIView *subView = [[UIView alloc] initWithFrame:popupView.frame];
UIColor * backImgColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blue_Img.png"]];
subView.backgroundColor = backImgColor;
subView.alpha = 0.5;
[mainView addSubview:subView];