使用设置为模糊的 UIVisualEffectView 可以做的最好的事情是新的模糊样式
systemUltraThinMaterial、systemThinMaterial、systemMaterial、systemThickMaterial 和 systemChromeMaterial(以及它们的浅色和深色变体。)
超薄材质样式的模糊量最少,而厚材质样式的模糊量最多,但这并没有太多控制。有时我想要一个非常微妙的模糊。甚至 systemUltraThinMaterial 也应用了很多模糊。
基于another answer 到这里的这个主题,我创建了自己的模糊视图。我没有创建一个放置在另一个视图之上的视图,而是创建了一个 UIView 的自定义子类,它模糊了它的内容。您将所需的任何子视图放入视图中,它会在视图内容的顶部添加一个模糊层。
注意: 正如 Matt 在 cmets 中指出的那样,我的 BlurView 类不提供实时模糊。它获取视图内容和子视图的快照,对其进行模糊处理,并将结果安装为视图内容层之上的一个层。如果您需要对模糊视图进行实时模糊处理,此解决方案不适合您。
这是一个 github 存储库,其中包含一个使用我的 BlurView 类的工作示例:
https://github.com/DuncanMC/BlurView.git
要使用它,只需将 BlurView.swift 文件添加到您的项目中即可。
然后将 UIView 添加到您的情节提要中,并将您想要模糊的任何内容作为子视图放入其中。 (或者你可以继承 BlurView)
在运行时,BlurView 在视图的内容层之上添加一个层,其中包含视图内容的模糊版本。 blurLevel 属性允许您控制应用于图像的模糊效果的半径。小于 1 的值提供了非常微妙的模糊量,默认值 10 提供了相当强的模糊量。
blur 布尔值打开和关闭模糊效果。
演示应用显示了一张图片、一些文本和一个带有背景层和边框颜色的视图。
这是关闭模糊后的示例视图:
以及模糊半径为 5 的 BlurView 的样子(我认为这是相当强烈的模糊量:)
为了比较,UIVisualEffectView 上新的 iOS 13“材质”设置“systemUltraThinMaterial”的最轻模糊量如下所示:
(超薄材质模糊选项似乎使用了 30 左右的模糊半径)
正如 Leo 在他的评论中指出的那样,UIVisualEffectView 的自适应形式对跟随用户的亮模式或暗模式设置的模糊应用了亮化或暗化。如果这对您很重要,您可能需要使用 UIVisualEffectView。
我怀疑在我的模糊视图中添加变亮或变暗步骤并使其尊重用户的亮模式/暗模式设置并不难。 Core Image 有很多不同的滤镜,很容易组合它们。
编辑:
根据 LeoDabus 下面的评论,我决定在 BlurView 中添加一个曝光补偿滤镜。下面是带有该选项的示例应用程序的屏幕截图。上图是我的 BlurView,模糊半径为 25,EV 值为 -1,下图是 systemUltraThinMaterialDark 风格的 UIVisualEffectView。我认为它们看起来非常接近 - 但我的 BlurView 可让您根据需要获得无限多种不同的外观。
编辑#2:
在 Matt 在他的 cmets 中提到 UIImageEffects 之后,我找到了该 Apple 示例代码的 Swift 版本。它非常易于使用,并且比模糊核心图像过滤器快很多。 (请注意,Swift 版本的 UIImageEffects 保留了默认的“Copyright <authorname>。保留所有权利。”版权声明,因此未经作者许可,我不建议在您的项目中使用它。)
我更新了我的示例项目,使其具有“使用核心图像”UISwitch。当您关闭该开关时,它会使用 UIImageEffects 进行模糊处理。
UIImageEffects 库有一些预设可以创建近似于明暗模糊模式的外观,但它还包括另一个不同的选项。我的示例应用程序当前设置为在指定的模糊半径处模仿灯光样式。 (它忽略了UIImageEffects模式下的亮度调整设置。)
更新的版本位于https://github.com/DuncanMC/BlurView.git的同一仓库中名为 UIImageEffects 的分支中