En fait, je parie que ce serait assez simple à réaliser. Il ne serait probablement pas fonctionner ou de ressembler exactement à ce que Apple a à faire, mais peuvent être très proches.
Tout d'abord, vous devez déterminer la CGRect de la UIView que vous allez présenter. Une fois que vous avez déterminé que vous n'avez qu'à saisir une image de la partie de l'INTERFACE utilisateur de sorte qu'il peut être floue. Quelque chose comme ceci...
- (UIImage*)getBlurredImage {
// You will want to calculate this in code based on the view you will be presenting.
CGSize size = CGSizeMake(200,200);
UIGraphicsBeginImageContext(size);
[view drawViewHierarchyInRect:(CGRect){CGPointZero, w, h} afterScreenUpdates:YES]; // view is the view you are grabbing the screen shot of. The view that is to be blurred.
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Gaussian Blur
image = [image applyLightEffect];
// Box Blur
// image = [image boxblurImageWithBlur:0.2f];
return image;
}
Flou Gaussien - Recommandé
À l'aide de l' UIImage+ImageEffects
Catégorie d'Apple fourni ici, vous obtiendrez un flou gaussien qui ressemble beaucoup comme le flou dans iOS 7.
Zone De Flou
Vous pouvez également utiliser une zone de flou à l'aide de la suite de boxBlurImageWithBlur:
UIImage catégorie. Il est basé sur un algorythem que vous pouvez trouver ici.
@implementation UIImage (Blur)
-(UIImage *)boxblurImageWithBlur:(CGFloat)blur {
if (blur < 0.f || blur > 1.f) {
blur = 0.5f;
}
int boxSize = (int)(blur * 50);
boxSize = boxSize - (boxSize % 2) + 1;
CGImageRef img = self.CGImage;
vImage_Buffer inBuffer, outBuffer;
vImage_Error error;
void *pixelBuffer;
CGDataProviderRef inProvider = CGImageGetDataProvider(img);
CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
inBuffer.width = CGImageGetWidth(img);
inBuffer.height = CGImageGetHeight(img);
inBuffer.rowBytes = CGImageGetBytesPerRow(img);
inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
if(pixelBuffer == NULL)
NSLog(@"No pixelbuffer");
outBuffer.data = pixelBuffer;
outBuffer.width = CGImageGetWidth(img);
outBuffer.height = CGImageGetHeight(img);
outBuffer.rowBytes = CGImageGetBytesPerRow(img);
error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
if (error) {
NSLog(@"JFDepthView: error from convolution %ld", error);
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate(outBuffer.data,
outBuffer.width,
outBuffer.height,
8,
outBuffer.rowBytes,
colorSpace,
kCGImageAlphaNoneSkipLast);
CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
//clean up
CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
free(pixelBuffer);
CFRelease(inBitmapData);
CGImageRelease(imageRef);
return returnImage;
}
@end
Maintenant que vous êtes le calcul de la zone de l'écran pour le flou, le passage dans la catégorie flou et la réception d'une UIImage de retour qui a été brouillée, maintenant tout ce qui reste est de mettre le flou de l'image comme arrière-plan de la vue que vous allez présenter. Comme je l'ai dit, ce ne sera pas un match parfait pour ce que fait Apple, mais il faudrait tout de même l'air assez cool.
Espérons que cela aide.