如何产生类似于 iOS 7 模糊视图的效果?

Posted

技术标签:

【中文标题】如何产生类似于 iOS 7 模糊视图的效果?【英文标题】:How can I produce an effect similar to the iOS 7 blur view? 【发布时间】:2013-06-12 00:01:53 【问题描述】:

我正在尝试从 Apple 公开发布的 ios 7 示例屏幕中复制这种模糊的背景:

This question 建议对以下内容应用 CI 过滤器,但这是一种完全不同的方法。很明显,iOS 7 没有捕获下面视图的内容,原因有很多:

    进行一些粗略的测试、截取下面视图的屏幕截图并应用半径足够大的 CIGaussianBlur 滤镜以模仿 iOS 7 的模糊样式,即使在模拟器上也需要 1-2 秒。 iOS 7 模糊视图能够模糊动态视图,例如视频或动画,没有明显的延迟。

谁能假设他们可以使用哪些框架来创建这种效果,以及是否可以使用当前的公共 API 创建类似的效果?

编辑:(来自评论)我们并不完全了解 Apple 是如何做到的,但我们可以做出任何基本假设吗?我们可以假设他们正在使用硬件,对吧?

效果是否在每个视图中都是独立的,以至于效果实际上并不知道其背后是什么?还是必须根据模糊的工作原理,考虑模糊背后的内容?

如果效果背后的内容是相关的,我们是否可以假设 Apple 正在接收下面内容的“提要”并不断地模糊渲染它们?

【问题讨论】:

(我认为我们可以假设苹果无论如何都在使用纯 GL 来渲染主屏幕。我怀疑他们用 UIViews 和其他会降低性能的东西来抽象它,因为它是如此关键的部分操作系统) 正如我在 cmets 中对我的回答所指出的那样:***.com/a/17048668/19679 他们编写了操作系统,因此他们当然会加速访问当前视图下方合成的图层的内容。我们可以看到他们可能在私有 IOSurface API 中使用的一些内容:***.com/questions/14135215/…。如果高斯模糊具有固定半径,甚至可以使用积分图像等有趣的优化方法,则高斯模糊可以比广义高斯模糊情况快得多。 @BradLarson - 套用杰西卡辛普森的意思......我不知道这意味着什么,但听起来很酷!但是说真的,您是说可以使用带有模糊滤镜的部分透明视图并将其覆盖在另一个视图上来实现此效果吗? ***.com/a/25706250/2308190 在我第一次尝试时非常适合我,而且很简洁 【参考方案1】:

为什么要复制效果?只需在视图后面绘制一个 UIToolbar。

myView.backgroundColor = [UIColor clearColor];
UIToolbar* bgToolbar = [[UIToolbar alloc] initWithFrame:myView.frame];
bgToolbar.barStyle = UIBarStyleDefault;
[myView.superview insertSubview:bgToolbar belowSubview:myView];

【讨论】:

我不同意 crizzwald 的观点。我不认为这是对苹果将要做什么的预期规则的一个很好的解释。 本周我在他们的 Tech Talks 实验室由 Apple UIKit 工程师运行了这种方法。虽然他当然不会支持这种方法,但他认识到效果的必要性以及为此缺乏真正的公共 API,并表示这种方法目前是“最不邪恶”的选择,并且在编写时相当安全。具体来说,他说不要尝试对此工具栏/视图的frametransform 或类似的东西做任何动画,否则会发生不好的事情。他还强烈建议提交 Radar 的 bug 报告,在内部构建一个案例,这样我们就可以获得一个真正的公共 API 来实现这个效果! 有趣...看起来@user2342340 帐户是为了匿名回答这个问题而创建的。让你想知道这是否不是一个比我们其他人更了解这些事情的人的非官方帖子:) 这在运行iOS 7的iPhone 4上不起作用。可能是因为在iPhone 4上,由于GPU功率太低,系统没有给UITabBar本身添加通常的模糊效果. 如何让它变成非白色?如果我更改工具栏的背景颜色,它不会显示模糊。【参考方案2】:

Apple 在 WWDC 上发布了包含此功能的 UIImage 类别代码,如果您有开发者帐户,则可以通过以下链接获取 UIImage 类别(以及其余示例代码):https://developer.apple.com/wwdc/schedule/ 并浏览对于第 226 节并单击详细信息。我还没有玩过它,但我认为 iOS 6 上的效果会慢很多,iOS 7 有一些增强功能,可以更快地抓取用作模糊输入的初始屏幕截图。

直接链接:https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip

【讨论】:

我看到视频,可以看,但是不知道在哪里下载示例代码! 与简单的背景 alpha 变化相比,我没有看到太大的区别;也许是因为我正在显示视频,他们只是需要更多的模糊......【参考方案3】:

实际上,我敢打赌这很容易实现。它可能不会像 Apple 所做的那样运行或看起来完全一样,但可能非常接近。

首先,您需要确定要呈现的 UIView 的 CGRect。一旦你确定你只需要抓取 UI 的一部分的图像,它就可以被模糊。像这样的...

- (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;

高斯模糊 - 推荐

使用 Apple 提供的 here 类别 UIImage+ImageEffects,您将获得与 iOS 7 中的模糊非常相似的高斯模糊。

框模糊

您还可以使用以下boxBlurImageWithBlur: UIImage 类别来使用框模糊。这是基于您可以找到here 的算法。

@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

现在您正在计算要模糊的屏幕区域,将其传递到模糊类别并接收已模糊的 UIImage 返回,现在剩下的就是将该模糊图像设置为您将要成为的视图的背景呈现。就像我说的,这与 Apple 的做法并不完美,但它看起来仍然很酷。

希望对你有帮助。

【讨论】:

模糊图像的蓝色和红色似乎互换了。 看起来有人使用您的代码创建了这个项目:github.com/alexdrone/ios-realtimeblur/blob/master/RealTimeBlur/…,但不幸的是没有署名,他们在顶部添加了“保留所有权利”版权声明。跨度> @Mark,感谢您的提醒。但是,这个模糊算法不是我自己的。我已经在上面的帖子中提到了我从哪里得到它。正如它在我的帖子中所说的那样“这是基于你可以在这里找到的算法。”带有indieambitions.com/idevblogaday/… 的链接,我一定会向此人发送消息,并让他们知道他们缺少归属。谢谢 @MarkErdmann 在 xcode 中查看您自己的文件。它具有“保留所有权利”。它是 xcode 添加的通用内容。此外,作者还添加了一个 license.md,上面写着它是在 mit lisence 下获得许可的 不要使用renderInContext,使用新的drawViewHierarchyInRect:snapshotView:。 WWDC talk 216“在 iOS7 上实现 Engaging UI”声称性能提升了 5-15 倍。【参考方案4】:

iOS8 回答了这些问题。

- (instancetype)initWithEffect:(UIVisualEffect *)effect

或斯威夫特:

init(effect effect: UIVisualEffect)

【讨论】:

我猜这个解决方案在 iOS 9 出来之前基本没用。大多数应用程序仍然支持 iOS 7,但那里不支持此解决方案。 true true,你现在可以使用这种东西:github.com/nicklockwood/FXBlurView 我用 iOS8 的 Xcode 6 工具链实现了这个,效果很好。我尝试使用 CPU 来实现,但工作速度明显比这种方法慢。 当 Xcode 在故事板本身中提供时为什么要编码!!!!!!谢谢@AdamWaite【参考方案5】:

我刚刚编写了 UIView 的小子类,它能够在任何自定义视图上生成原生 iOS 7 模糊。它使用 UIToolbar,但以一种安全的方式通过实时动画更改其框架、边界、颜色和 alpha。

如果您发现任何问题,请告诉我。

https://github.com/ivoleko/ILTranslucentView

【讨论】:

我尝试了其他一些方法(比如自己添加一个 UIToolbar,或者苹果的 UIImage+ImageEffects.h 类别);你是最好和最简单的解决方案。谢谢! 它对新的 iOS 7.0.3 下载的反应如何?使用此技术的其他类不再正确渲染:[ @achi,我没有注意到 iOS 7.0.3 有任何问题。 您知道是否有任何应用使用您的方法制作动画并已被 Apple 接受? 大家好。是的,使用该类的应用程序将获得 Apple 的批准!【参考方案6】:

有传言称,Apple 工程师声称,为了提高性能,他们直接从 gpu 缓冲区中读取,这会引发安全问题,这就是为什么还没有公共 API 来执行此操作的原因。

【讨论】:

如果这是真的,那么这是迄今为止最糟糕的解决方案。 aaaaa 并且从 iOS 7 中移除了模糊。 它仅在出现性能问题的设备上被删除。 这个帖子是谣言的来源吗? :) 那个谣言可能是假的。 iOS 上的 OpenGL ES 2.0 允许您在没有任何安全风险的情况下读取和写入帧缓冲区。模糊是使用 GLSL 着色器完成的,这就是它运行速度快的原因。【参考方案7】:

这是您可以在 WWDC 的视频中看到的解决方案。你必须做一个高斯模糊,所以你要做的第一件事就是用我在这里写的代码添加一个新的.m和.h文件,然后你必须制作和屏幕截图,使用所需的效果和将它添加到您的视图,然后您的 UITable UIView 或任何必须透明的东西,您可以使用 applyBlurWithRadius 来存档所需的效果,此调用适用于任何 UIImage。

最后,模糊的图像将成为背景,上面的其余控件必须是透明的。

为此,您必须添加下一个库:

Acelerate.framework,UIKit.framework,CoreGraphics.framework

希望你喜欢。

编码愉快。

    //Screen capture.
    UIGraphicsBeginImageContext(self.view.bounds.size);

    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(c, 0, 0);
    [self.view.layer renderInContext:c];

    UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext();
    viewImage = [viewImage applyLightEffect];

    UIGraphicsEndImageContext();

    //.h FILE
    #import <UIKit/UIKit.h>

    @interface UIImage (ImageEffects)

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

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

   @end

    //.m FILE
    #import "cGaussianEffect.h"
    #import <Accelerate/Accelerate.h>
    #import <float.h>


     @implementation UIImage (ImageEffects)


    - (UIImage *)applyLightEffect
    
        UIColor *tintColor = [UIColor colorWithWhite:1.0 alpha:0.3];
        return [self applyBlurWithRadius:1 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
    


    - (UIImage *)applyExtraLightEffect
    
        UIColor *tintColor = [UIColor colorWithWhite:0.97 alpha:0.82];
        return [self applyBlurWithRadius:1 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
    


    - (UIImage *)applyDarkEffect
    
        UIColor *tintColor = [UIColor colorWithWhite:0.11 alpha:0.73];
        return [self applyBlurWithRadius:1 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
    


    - (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor
    
        const CGFloat EffectColorAlpha = 0.6;
        UIColor *effectColor = tintColor;
        int componentCount = CGColorGetNumberOfComponents(tintColor.CGColor);
        if (componentCount == 2) 
            CGFloat b;
            if ([tintColor getWhite:&b alpha:NULL]) 
                effectColor = [UIColor colorWithWhite:b alpha:EffectColorAlpha];
            
        
        else 
            CGFloat r, g, b;
            if ([tintColor getRed:&r green:&g blue:&b alpha:NULL]) 
                effectColor = [UIColor colorWithRed:r green:g blue:b alpha:EffectColorAlpha];
            
        
        return [self applyBlurWithRadius:10 tintColor:effectColor saturationDeltaFactor:-1.0 maskImage:nil];
    


    - (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage
    
        if (self.size.width < 1 || self.size.height < 1) 
            NSLog (@"*** error: invalid size: (%.2f x %.2f). Both dimensions must be >= 1: %@", self.size.width, self.size.height, self);
            return nil;
        
        if (!self.CGImage) 
            NSLog (@"*** error: image must be backed by a CGImage: %@", self);
            return nil;
        
        if (maskImage && !maskImage.CGImage) 
            NSLog (@"*** error: maskImage must be backed by a CGImage: %@", maskImage);
            return nil;
        

        CGRect imageRect =  CGPointZero, self.size ;
        UIImage *effectImage = self;

        BOOL hasBlur = blurRadius > __FLT_EPSILON__;
        BOOL hasSaturationChange = fabs(saturationDeltaFactor - 1.) > __FLT_EPSILON__;
        if (hasBlur || hasSaturationChange) 
            UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
            CGContextRef effectInContext = UIGraphicsGetCurrentContext();
            CGContextScaleCTM(effectInContext, 1.0, -1.0);
            CGContextTranslateCTM(effectInContext, 0, -self.size.height);
            CGContextDrawImage(effectInContext, imageRect, self.CGImage);

            vImage_Buffer effectInBuffer;
            effectInBuffer.data     = CGBitmapContextGetData(effectInContext);
            effectInBuffer.width    = CGBitmapContextGetWidth(effectInContext);
            effectInBuffer.height   = CGBitmapContextGetHeight(effectInContext);
            effectInBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectInContext);

            UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
            CGContextRef effectOutContext = UIGraphicsGetCurrentContext();
            vImage_Buffer effectOutBuffer;
            effectOutBuffer.data     = CGBitmapContextGetData(effectOutContext);
            effectOutBuffer.width    = CGBitmapContextGetWidth(effectOutContext);
            effectOutBuffer.height   = CGBitmapContextGetHeight(effectOutContext);
            effectOutBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectOutContext);

            if (hasBlur) 
                CGFloat inputRadius = blurRadius * [[UIScreen mainScreen] scale];
                NSUInteger radius = floor(inputRadius * 3. * sqrt(2 * M_PI) / 4 + 0.5);
                if (radius % 2 != 1) 
                    radius += 1;
                
                vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);
                vImageBoxConvolve_ARGB8888(&effectOutBuffer, &effectInBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);
                vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);
            
            BOOL effectImageBuffersAreSwapped = NO;
            if (hasSaturationChange) 
                CGFloat s = saturationDeltaFactor;
                CGFloat floatingPointSaturationMatrix[] = 
                    0.0722 + 0.9278 * s,  0.0722 - 0.0722 * s,  0.0722 - 0.0722 * s,  0,
                    0.7152 - 0.7152 * s,  0.7152 + 0.2848 * s,  0.7152 - 0.7152 * s,  0,
                    0.2126 - 0.2126 * s,  0.2126 - 0.2126 * s,  0.2126 + 0.7873 * s,  0,
                                  0,                    0,                    0,  1,
                ;
                const int32_t divisor = 256;
                NSUInteger matrixSize = sizeof(floatingPointSaturationMatrix)/sizeof(floatingPointSaturationMatrix[0]);
                int16_t saturationMatrix[matrixSize];
                for (NSUInteger i = 0; i < matrixSize; ++i) 
                    saturationMatrix[i] = (int16_t)roundf(floatingPointSaturationMatrix[i] * divisor);
                
                if (hasBlur) 
                    vImageMatrixMultiply_ARGB8888(&effectOutBuffer, &effectInBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags);
                    effectImageBuffersAreSwapped = YES;
                
                else 
                    vImageMatrixMultiply_ARGB8888(&effectInBuffer, &effectOutBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags);
                
            
            if (!effectImageBuffersAreSwapped)
                effectImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();

            if (effectImageBuffersAreSwapped)
                effectImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        

        UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
        CGContextRef outputContext = UIGraphicsGetCurrentContext();
        CGContextScaleCTM(outputContext, 1.0, -1.0);
        CGContextTranslateCTM(outputContext, 0, -self.size.height);

        CGContextDrawImage(outputContext, imageRect, self.CGImage);

        if (hasBlur) 
            CGContextSaveGState(outputContext);
            if (maskImage) 
                CGContextClipToMask(outputContext, imageRect, maskImage.CGImage);
            
            CGContextDrawImage(outputContext, imageRect, effectImage.CGImage);
            CGContextRestoreGState(outputContext);
        

        if (tintColor) 
            CGContextSaveGState(outputContext);
            CGContextSetFillColorWithColor(outputContext, tintColor.CGColor);
            CGContextFillRect(outputContext, imageRect);
            CGContextRestoreGState(outputContext);
        

        UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return outputImage;
    

【讨论】:

【参考方案8】:

您可以在此页面的苹果 DEMO 中找到您的解决方案: WWDC 2013,查找并下载 UIImageEffects 示例代码。

然后使用@Jeremy Fox 的代码。我把它改成

- (UIImage*)getDarkBlurredImageWithTargetView:(UIView *)targetView

    CGSize size = targetView.frame.size;

    UIGraphicsBeginImageContext(size);
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(c, 0, 0);
    [targetView.layer renderInContext:c]; // view is the view you are grabbing the screen shot of. The view that is to be blurred.
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return [image applyDarkEffect];

希望这会对你有所帮助。

【讨论】:

【参考方案9】:

这是一个非常简单的方法:https://github.com/JagCesar/iOS-blur

只需复制 UIToolbar 的图层即可,AMBlurView 会为您完成。 好吧,它没有控制中心那么模糊,但已经够模糊了。

记住 iOS7 处于保密协议下。

【讨论】:

【参考方案10】:

这里的每个响应都使用 vImageBoxConvolve_ARGB8888 这个函数真的非常慢,如果性能不是高优先级要求,那很好,但是如果你使用它在两个视图控制器之间转换(例如)这种方法意味着超过 1 秒甚至更多的时间,这对您的应用程序的用户体验非常不利。

如果您更愿意将所有这些图像处理留给 GPU(而且您应该),您可以获得更好的效果,并且可以在 50 毫秒左右(假设您在第一种方法中有 1 秒的时间)获得更好的效果,所以,让我们去做吧。

首先下载GPUImage框架(BSD许可)here。

接下来,从 GPUImage 添加以下类(.m 和 .h)(我不确定这些只是模糊效果所需的最低要求)

GPUImage.h GPUImageAlphaBlendFilter GPUImageFilter GPUImageFilterGroup GPUImageGaussianBlurPositionFilter GPUImageGaussianSelectiveBlurFilter GPUImageLuminanceRangeFilter GPUImageOutput GPUImageTwoInputFilter GL 程序 GPUImageBoxBlurFilter GPUImageGaussianBlurFilter GPUImageiOSBlurFilter GPUImageSaturationFilter GPUImageSolidColorGenerator GPUImageTwoPassFilter

GPUImageTwoPassTextureSamplingFilter

iOS/GPUImage-Prefix.pch

iOS/GPUImageContext iOS/GPUImageMovieWriter iOS/GPUImagePicture iOS/GPUImageView

接下来,在 UIImage 上创建一个类别,这将为现有的 UIImage 添加模糊效果:

#import "UIImage+Utils.h"

#import "GPUImagePicture.h"
#import "GPUImageSolidColorGenerator.h"
#import "GPUImageAlphaBlendFilter.h"
#import "GPUImageBoxBlurFilter.h"

@implementation UIImage (Utils)

- (UIImage*) GPUBlurredImage

    GPUImagePicture *source =[[GPUImagePicture alloc] initWithImage:self];

    CGSize size = CGSizeMake(self.size.width * self.scale, self.size.height * self.scale);

    GPUImageBoxBlurFilter *blur = [[GPUImageBoxBlurFilter alloc] init];
    [blur setBlurRadiusInPixels:4.0f];
    [blur setBlurPasses:2.0f];
    [blur forceProcessingAtSize:size];
    [source addTarget:blur];

    GPUImageSolidColorGenerator * white = [[GPUImageSolidColorGenerator alloc] init];

    [white setColorRed:1.0f green:1.0f blue:1.0f alpha:0.1f];
    [white forceProcessingAtSize:size];

    GPUImageAlphaBlendFilter * blend = [[GPUImageAlphaBlendFilter alloc] init];
    blend.mix = 0.9f;

    [blur addTarget:blend];
    [white addTarget:blend];

    [blend forceProcessingAtSize:size];
    [source processImage];

    return [blend imageFromCurrentlyProcessedOutput];


@end

最后,将以下框架添加到您的项目中:

AV 基金会 核心媒体 核心视频 OpenGLES

是的,这种更快的方法很有趣;)

【讨论】:

【参考方案11】:

您可以尝试使用我的自定义视图,它具有模糊背景的功能。它通过伪造背景快照并将其模糊来做到这一点,就像 Apple 的 WWDC 代码中的那样。使用起来非常简单。

我还做了一些改进,在不损失性能的情况下伪造动态模糊。我的视图的背景是一个滚动视图,它随着视图滚动,从而为超级视图的其余部分提供模糊效果。

查看my GitHub上的示例和代码

【讨论】:

【参考方案12】:

Core Background 实现了所需的 iOS 7 效果。

https://github.com/justinmfischer/core-background

免责声明:我是这个项目的作者

【讨论】:

以上是关于如何产生类似于 iOS 7 模糊视图的效果?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 中将用户背景添加到具有模糊效果的应用程序中?

我们如何实现像 iOS 14 AppLibrary 这样的模糊效果? (SearchBar 后面的模糊效果)

如何在 iOS6 中的 UIView 上获得高斯模糊效果

iOS 7 TableView 中的 ViewController 和 NavigationBar 模糊效果

有没有办法在 iOS 中使用表格视图设计类似 Tinder/Twitter-self-profile 的标题效果?

iOS 7 风格的模糊视图