像iOS 8的聚光灯一样,交互模糊UIImage和UIView

3
iOS 8引入了一些相当酷炫的交互式模糊效果。其中最显著的是在下拉搜索时的交互式模糊,但在打开和关闭Siri时也有动画效果(尽管这不是交互式的)。我只在另一个地方注意到了这种交互式模糊:官方Twitter应用程序中,在个人资料视图上拉时会出现视差头像缩放和模糊效果有时
我尝试使用UISlider基于CoreImage和GPUImage进行基本动画(基于这个问题的答案以及苹果公司的UIImage+ImageEffects),但似乎没有一种适当的性能足够快地连续模糊图像(即将图像模糊到单个值一次可以快速完成,但帧速率不足以连续模糊)。 如何以一种性能良好的方式实现这些方法,使其足以交互式地对UIImage(以及理想情况下的UIView或CIContext快照)进行模糊处理和取消模糊处理?

拍摄您的视图截图,然后对截图进行模糊处理。 - Nick Wilkerson
@NickWilkerson 这里的关键词是 交互式。 我链接的两篇文章正是在做这件事,但它们不够高效,除非在 GCD dispatch_async 中运行,而那样就不是线程安全的。 - brandonscript
1
在开始动画之前,预先计算帧(如果我正确理解了您的问题,则具有不同程度的模糊),这样您就可以在动画期间将它们存储在内存中。 - quentinadam
1
我在 Reddit 上找到了这个,可能是你要找的 http://www.reddit.com/r/iOSProgramming/comments/2jjuec/how_does_apple_achieve_the_slidedown_blur_effect/ - akaralar
@akaralar 哇,这真是太棒了 - 它看起来实际上可以工作。我得试一试。 - brandonscript
显示剩余4条评论
1个回答

0

没有一种简单而固定的方法来做到这一点,但是如果您遵循以下步骤和可选方式,它肯定是可行的:

  1. 最重要的是:对图像进行下采样。高斯模糊的基本分辨率并不是非常重要。如果您只将分辨率降低到一半,数据量就会减少四分之一!

  2. 定义最终目标模糊半径。

  3. 利用 C 函数检索设备的架构,并根据处理能力为不同的架构使用不同的 delta 饱和度参数值。

  4. 使用 Apple 提供的库创建模糊效果,步长与交互参数的步长值相关(例如 KVO 到 contentOffset 属性)。使用 dispatch_async 并不要忘记在主队列中回调模糊图像!

  5. 上述方法几乎肯定可以满足从 arm7s 开始的所有架构,但您可能仍然会遇到一些 arm7 的问题 - 如 iPhone 4s)。

  6. 如果仍然存在问题,例如上述的 arm7,则将所需的 contentOffset 更改加倍以使下一个模糊具有更大的半径。然后,而不是在 UIImageView 上更改图像属性,最好创建新的 UIImageView 并使用新的模糊 UIImage,在创建下一个模糊页面的期间将 alpha 通道从 0 淡入到 1。

  7. 您可以使用许多技巧,例如依次创建所有模糊图像以获得完整的交互比例,并将它们缓存在集合中,并在第 6 点中描述的方法中使用它们。

如果动画不是交互式的,而是在特定帧中定时的话,还有许多其他技术可供使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接