iOS 7 Translucent Modal View Controller iOS 7 Translucent Modal View Controller ios ios

iOS 7 Translucent Modal View Controller


With the release of iOS 8.0, there is no need for getting an image and blurring it anymore. As Andrew Plummer pointed out, you can use UIVisualEffectView with UIBlurEffect.

UIViewController * contributeViewController = [[UIViewController alloc] init];UIBlurEffect * blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];UIVisualEffectView *beView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];beView.frame = self.view.bounds;contributeViewController.view.frame = self.view.bounds;contributeViewController.view.backgroundColor = [UIColor clearColor];[contributeViewController.view insertSubview:beView atIndex:0];contributeViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;[self presentViewController:contributeViewController animated:YES completion:nil];

Solution that works before iOS 8

I would like to extend on rckoenes' answer:

As emphasised, you can create this effect by:

  1. Convert the underlying UIView to an UIImage
  2. Blur the UIImage
  3. Set the UIImage as background of your view.

enter image description here


Sounds like a lot of work, but is actually done pretty straight-forward:

1. Create a category of UIView and add the following method:

-(UIImage *)convertViewToImage{    UIGraphicsBeginImageContext(self.bounds.size);    [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return image;}

2. Make an image of the current view and blur it by using Apple's Image Effect category (download)

UIImage* imageOfUnderlyingView = [self.view convertViewToImage];imageOfUnderlyingView = [imageOfUnderlyingView applyBlurWithRadius:20                             tintColor:[UIColor colorWithWhite:1.0 alpha:0.2]                 saturationDeltaFactor:1.3                             maskImage:nil];

3. Set it as background of your overlay.

-(void)viewDidLoad{   self.view.backgroundColor = [UIColor clearColor];   UIImageView* backView = [[UIImageView alloc] initWithFrame:self.view.frame];   backView.image = imageOfUnderlyingView;   backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];   [self.view addSubview:backView];}


Just reimplemented Sebastian Hojas' solution in Swift:

1. Create a UIView extension and add the following method:

extension UIView {    func convertViewToImage() -> UIImage{        UIGraphicsBeginImageContext(self.bounds.size);        self.drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)        let image = UIGraphicsGetImageFromCurrentImageContext()        UIGraphicsEndImageContext();        return image;    }}

2. Make an image of the current view and blur it by using Apple's Image Effect (I found a reimplementation of this in Swift here: SwiftUIImageEffects

var imageOfUnderlyingView = self.view.convertViewToImage()imageOfUnderlyingView = imageOfUnderlyingView.applyBlurWithRadius(2, tintColor: UIColor(white: 0.0, alpha: 0.5), saturationDeltaFactor: 1.0, maskImage: nil)!

3. Set it as background of your overlay.

let backView = UIImageView(frame: self.view.frame)backView.image = imageOfUnderlyingViewbackView.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)view.addSubview(backView)


I think this is the easiest solution for a modal view controller that overlays everything with a nice blur (iOS8)

    UIViewController * contributeViewController = [[UIViewController alloc] init];    UIBlurEffect * blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];    UIVisualEffectView *beView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];    beView.frame = self.view.bounds;    contributeViewController.view.frame = self.view.bounds;    contributeViewController.view.backgroundColor = [UIColor clearColor];    [contributeViewController.view insertSubview:beView atIndex:0];    contributeViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;    [self presentViewController:contributeViewController animated:YES completion:nil];