我试图复制苹果公开发布的iOS 7示例屏幕上的模糊背景:

这个问题建议对下面的内容应用CI过滤器,但这是一个完全不同的方法。很明显,iOS 7并没有捕捉到下面视图的内容,原因有很多:

做一些粗略的测试,截取以下视图的截图,并应用CIGaussianBlur过滤器,使用足够大的半径来模拟iOS 7的模糊风格,即使在模拟器上也需要1-2秒。 iOS 7的模糊视图能够模糊动态视图,比如视频或动画,没有明显的延迟。

有没有人可以假设他们可以使用什么框架来创建这种效果,以及是否有可能使用当前的公共api创建类似的效果?

编辑:(来自评论)我们不知道苹果是怎么做的,但我们能做出一些基本的假设吗?我们可以假设他们在使用硬件,对吧?

效果是否在每个视图中都是自包含的,以至于效果实际上不知道它背后是什么?或者,基于模糊的工作原理,模糊背后的内容必须被考虑进去?

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


当前回答

我写了UIView的子类它能在任何自定义视图上产生原生ios7模糊。它使用UIToolbar,但以一种安全的方式改变它的帧,边界,颜色和alpha实时动画。

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

https://github.com/ivoleko/ILTranslucentView

其他回答

核心背景实现了预期的iOS 7效果。

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

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

有传言称,苹果工程师声称,为了实现这一性能,他们直接从gpu缓冲区读取,这引发了安全问题,这就是为什么还没有公共API来做这件事。

你可以从苹果的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];
}

希望这对你有所帮助。

我写了UIView的子类它能在任何自定义视图上产生原生ios7模糊。它使用UIToolbar,但以一种安全的方式改变它的帧,边界,颜色和alpha实时动画。

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

https://github.com/ivoleko/ILTranslucentView

您可以尝试使用我的自定义视图,它具有模糊背景的功能。它通过假装拍摄背景快照并模糊它来做到这一点,就像苹果的WWDC代码中那样。使用起来很简单。

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

请参阅我的GitHub上的示例和代码