Blur screen with iOS 7's snapshot API

ios, ios7, objective-c

Solution

Sample Code from WWDC ios_uiimageeffects

There is a `UIImage` category named `UIImage+ImageEffects`

Here is its API:

- (UIImage *)applyLightEffect;
- (UIImage *)applyExtraLightEffect;
- (UIImage *)applyDarkEffect;
- (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor;

- (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius 
                       tintColor:(UIColor *)tintColor 
           saturationDeltaFactor:(CGFloat)saturationDeltaFactor 
                       maskImage:(UIImage *)maskImage;

For legal reason I can't show the implementation here, there is a demo project in it. should be pretty easy to get start with.

Problem

I believe the NDA is down, so I can ask this question. I have a UIView subclass: ``` BlurView *blurredView = ((BlurView *)[self.view snapshotViewAfterScreenUpdates:NO]); blurredView.frame = self.view.frame; [self.view addSubview:blurredView]; ``` It does its job so far in capturing the screen, but now I want to blur that view. How exactly do I go about this? From what I've read I need to capture the current contents of the view (context?!) and convert it to CIImage (no?) and then apply a CIGaussianBlur to it and draw it back on the view. How exactly do I do that? P.S. The view is not animated, so it should be OK performance wise. EDIT: Here is what I have so far. The problem is that I can't capture the snapshot to a UIImage, I get a black screen. But if I add the view as a subview directly, I can see the snapshot is there. ``` // Snapshot UIView *view = [self.view snapshotViewAfterScreenUpdates:NO]; // Convert to UIImage UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // Apply the UIImage to a UIImageView BlurView *blurredView = [[BlurView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)]; [self.view addSubview:blurredView]; blurredView.imageView.image = img; // Black screen -.- ``` BlurView.m: ``` - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code self.imageView = [[UIImageView alloc] init]; self.imageView.frame = CGRectMake(20, 20, 200, 200); [self addSubview:self.imageView]; } return self; } ```

Original source

Related problems