【问题标题】:How do you vary the blur radius for a UIVisualEffectView to create more or less blurring?你如何改变 UIVisualEffectView 的模糊半径来创建或多或少的模糊?
【发布时间】:2020-12-05 06:18:00
【问题描述】:

UIVisualEffectView 模糊样式做了很多模糊处理。我想控制模糊量。我该怎么做?

(请注意,这是一个“响亮”的问题,为这个问题提供一个新的答案,并提供更新的信息。其他大多数问题和答案都相当陈旧,而且答案确实有局限性。)

【问题讨论】:

  • 哪个答案? Apple 不建议更改视觉效果视图的 Alpha,并且不会产生所需的效果。使用 UIViewPropertyAnimator 冻结视图的动画可能有效,但这是一种无法提供精细控制的技巧。我在下面的回答可以让你用你想要的任何半径创建一个模糊。
  • 当我进行近距离投票时,SO 自动插入了我的评论文本。您可以在该问题中添加您的答案,以避免重复。
  • @EugeneDudnyk “我的评论文本是由 SO 自动插入的”是的,但您可以更改它,甚至删除它。
  • 当我从 StackExchange iOS 应用程序投票支持关闭时,我什至没有看到此文本...而且我现在无法编辑它:)

标签: ios swift uivisualeffectview


【解决方案1】:

使用设置为模糊的 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 的分支中

【讨论】:

  • 我更喜欢自适应样式,因为它们是动态的。如果您的应用程序支持明暗模式,那么您应该始终支持这些模式。这同样适用于标签和背景的动态颜色
  • @LeoDabus 如果你唯一的目标是使用标准的 UIVisualEffectView,那么当然,使用那些。然而,我发现模糊程度太高了。我希望能够灵活地通过可变数量模糊视图,这就是我的班级所做的。我为 BlurView 添加了一个曝光调整选项,我认为它很好地模仿了暗模式。下一步是给它一个自适应模式,它尊重用户的亮模式/暗模式设置。
  • 您需要明确说明使用 CIFilter 是 缓慢 的事实(因为渲染时间)。此外,您实际上并没有模糊背景;您正在拍摄某物的图片并将其模糊。所以你的模糊不是活的; Apple 是这样,因此如果模糊视图背后的内容发生变化,则可以通过模糊“看到”这种变化。
  • 实际上,我建议这个问题和答案不是敲诈,而是作弊。你没有回答问题。如何在视觉效果视图中控制模糊量的答案是您不知道。 您的 答案所做的只是告诉我们如何模糊图像,这里已经很好地介绍了这一点。 Apple 很久以前就发布了 UIImageEffects 扩展,它直接进行模糊卷积,并且比你正在做的要快得多。所以你的答案没有什么新东西。我很高兴您为自己做了一个很好的扩展,但最好从现有问题链接到它。
  • 关于我的解决方案不提供实时模糊的公平点。我将编辑我的答案以明确这一点。
猜你喜欢
  • 2018-08-20
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
相关资源
最近更新 更多