如何更改UIVisualEffectView的模糊半径以创建或多或少的模糊?

问题描述

UIVisualEffectView模糊样式会产生很多模糊。我想控制模糊量。我该怎么办?

(请注意,这是一个“令人振奋”的问题,它为该问题提供了新的答案,并提供了最新信息。其他大多数问题和答案都已经过时了,答案有实际限制。)

解决方法

将UIVisualEffectView设置为模糊效果最好的是新的模糊风格 systemUltraThinMaterial,systemThinMaterial,systemMaterial,systemThickMaterial和systemChromeMaterial(及其明暗变体)。

对于超薄材质样式,模糊量最少,而在较厚材质样式上,模糊量最多,但这并不是很多控制。有时我想要非常微妙的模糊。甚至系统UltraThinMaterial也应用了很多模糊效果。

基于another answer,我以此主题为基础,创建了自己的模糊视图。我没有创建放置在另一个视图之上的视图,而是创建了UIView的自定义子类来模糊其内容。您将所需的任何子视图放入视图中,并在视图内容之上添加了一个模糊的层。

注意::正如Matt在评论中指出的那样,我的BlurView类不提供实时模糊处理。它拍摄视图内容和子视图的快照,对其进行模糊处理,然后将结果安装为视图内容层之上的一层。如果您需要对模糊视图进行实时模糊处理,则此解决方案不适合您。

这是一个使用我的BlurView类的工作示例的github存储库:

https://github.com/DuncanMC/BlurView.git

要使用它,只需将BlurView.swift文件添加到您的项目中。

然后将一个UIView添加到您的情节提要,然后将要模糊化的任何内容作为子视图放入其中。 (或者,您可以继承BlurView的子类)

在运行时,BlurView在视图的内容层之上添加一个包含视图内容的模糊版本的层。使用blurLevel属性可以控制应用于图像的模糊效果的半径。小于1的值会提供非常微弱的模糊,默认值10会提供非常强的模糊。

blur布尔值可打开和关闭模糊效果。

该演示应用程序显示图片,一些文本以及带有背景图层和边框颜色的视图。

这是关闭了模糊的示例视图的样子:

enter image description here

模糊半径为5的BlurView的外观(我认为这是相当强的模糊量:)

enter image description here

为了进行比较,UIVisualEffectView上的“ iOS13新版”“材质”设置“ systemUltraThinMaterial”的最轻模糊量如下所示:

enter image description here

(超薄材质模糊选项似乎使用了大约30的模糊半径)

正如Leo在他的评论中指出的那样,UIVisualEffectView的自适应形式对用户的亮模式或暗模式设置之后的模糊应用了变亮或变暗。如果这对您很重要,则可能需要使用UIVisualEffectView。

我怀疑在我的模糊视图上添加亮或暗步并使其遵循用户的亮模式/暗模式设置并不难。 Core Image有很多不同的滤镜,可以很容易地将它们组合起来。

编辑:

基于下面的LeoDabus的评论,我决定向BlurView添加一个曝光补偿滤镜。下面是带有该选项的示例应用程序的屏幕截图。上面的图像是我的BlurView,模糊半径为25,EV值为-1,下面的图像是systemUltraThinMaterialDark样式的UIVisualEffectView。我认为它们看起来很接近-但是我的BlurView可以让您根据需要获得各种外观。

enter image description here


编辑#2:

Matt在评论中提到UIImageEffects之后,我找到了该Apple示例代码的Swift版本。它非常易于使用,并且比模糊核心图像滤镜的速度快很多。 (请注意,Swift版本的UIImageEffects保留了默认的“版权<authorname>。保留所有权利。”版权声明,因此,在未征得作者许可的情况下,我建议您不要在您的项目中使用它。)

我将示例项目更新为具有“ Use Core Image” UISwitch。当您关闭该开关时,它将使用UIImageEffects进行模糊处理。

UIImageEffects库具有一些预设,这些预设创建的外观近似于亮和暗模糊模式,但是它还包含另一个不同的选项。我的示例应用程序当前已设置为模仿指定模糊半径的灯光样式。 (它会忽略UIImageEffects模式下的亮度调整设置。)

更新的版本位于https://github.com/DuncanMC/BlurView.git的同一存储库中名为UIImageEffects的分支中。