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.

320
demandé sur Josh Caswell 2013-06-11 14:13:41

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.

474
répondu Joey 2017-12-02 18:08:35

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 /

278
répondu Jano 2014-04-18 23:14:29

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..

14
répondu NorthBlast 2015-02-23 04:40:21

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.

13
répondu xtravar 2013-10-17 18:53:19

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.

9
répondu Sam 2014-02-03 13:39:15

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;
}
8
répondu kev 2016-02-26 01:09:21

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.

5
répondu Aleksandar Vacić 2015-12-02 12:43:34

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)

de: https://stackoverflow.com/a/24083728/4020910

3
répondu BennyTheNerd 2017-05-23 12:02:47

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

2
répondu Jake 2013-09-11 14:30:56
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
    }
}
2
répondu Durul Dalkanat 2016-09-27 10:58:22

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

1
répondu Preet 2015-01-21 08:51:05

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"]];
1
répondu Zakaria Braksa 2016-02-08 01:01:00

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

1
répondu James Jordan Taylor 2017-10-18 15:31:06

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!

1
répondu steveluoxin 2018-02-06 07:30:15

enter image description here

de Xcode vous pouvez le faire facilement. Suivez les étapes de xcode. Drage vue d'effet visuel sur votre uivi ou imageview.

Codage Heureux :)

1
répondu Mehedi Hasan 2018-04-09 10:27:41

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()
    }
0
répondu RaptoX 2016-08-04 12:06:54

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
0
répondu Ciao 2018-07-09 04:19:00

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.. enter image description here enter image description here

0
répondu Jack 2018-07-18 15:53:05

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

-1
répondu Naishta 2018-04-09 11:08:08

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];
-3
répondu Sohail 2016-06-27 10:33:25