UIVisualEffectView模糊半径的动画效果如何实现?

13

正如标题所述,有没有一种方法可以动画化UIVisualEffectView的模糊半径?我在视图后面有一个动态背景,因此无法使用ImageEffects添加……据我所知,唯一能做到这一点的是动画化不透明度,但iOS会抱怨说这样做会破坏EffectView,所以绝对不是好主意...任何帮助将不胜感激。

1个回答

11

答案是肯定的。以下是一个从无模糊到模糊动画的示例:

// When creating your view...
let blurView = UIVisualEffectView()
// Later, when you want to animate...
UIView.animateWithDuration(1.0) { () -> Void in
    blurView.effect = UIBlurEffect(style: .Dark)
}

这将使模糊半径从零(完全透明,或者说 - 没有模糊效果)动画化到默认半径(完全模糊),持续一秒钟。 要执行反向动画:

UIView.animateWithDuration(1.0) { () -> Void in
    blurView.effect = nil
}

生成的动画会平滑地改变模糊半径,即使你实际上正在完全添加/删除模糊效果 - UIKit 在幕后知道该如何处理。

请注意,这并不总是可能的: 直到最近(不确定是什么时候),UIVisualEffectView 必须使用 UIVisualEffect 进行初始化,并且 effect 属性是只读的。现在,effect 变成了可选和可读/写(尽管文档没有更新...),并且 UIVisualEffectView 包括一个空的初始化程序,使我们能够执行这些动画。

唯一的限制是无法手动分配自定义模糊半径给 UIVisualEffectView - 你只能在'无模糊'和'完全模糊'之间进行动画。

编辑:如果有人感兴趣,我创建了一个UIVisualEffectView的子类,可以完全控制模糊半径。但需要注意的是它使用了一个私有的UIKit API,因此您可能不应该使用它提交审核应用。然而,对于原型或内部应用程序来说,它仍然是有趣和有用的: https://github.com/collinhundley/APCustomBlurView


如果您冻结动画,那么您可以在没有模糊和完全模糊之间获得某个位置。例如:blurView.layer.timeOffset = 0.5 - kevinl
@kevinl 我绝对不建议这样做 - 你可能会得到一些奇怪的结果,而且很可能会在未来出现问题。 - Hundley

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