通常要想创建一个特殊效果(如blur效果),可以创建一个UIVisualEffectView
视图对象,这个对象提供了一种简单的方式来实现复杂的视觉效果。这个可以把这个对象看作是效果的一个容器,实际的效果会影响到该视图对象底下的内容,对添加到该视图对象的contentView
中的内容不会有模糊效果。
我们举个例子来看看如果使用UIVisualEffectView
:
1 |
|
这段代码是在当前视图控制器上添加了一个UIImageView
作为背景图。然后在视图的一小部分中使用了blur
效果。
我们可以看到UIVisualEffectView
还是非常简单的。需要注意是的,不应该直接添加子视图到UIVisualEffectView
视图中,而是应该添加到UIVisualEffectView
对象的contentView
中。
另外,尽量避免将
UIVisualEffectView
对象的alpha
值设置为小于1.0的值,因为创建半透明的视图会导致系统在离屏渲染时去对UIVisualEffectView对象及所有的相关的子视图做混合操作。这不但消耗CPU/GPU,也可能会导致许多效果显示不正确或者根本不显示。
我们在上面看到,初始化一个UIVisualEffectView
对象的方法是UIVisualEffectView(effect: blurEffect)
,其定义如下:
init(effect effect: UIVisualEffect)
这个方法的参数是一个UIVisualEffect对象。我们查看官方文档,可以看到在UIKit中,定义了几个专门用来创建视觉特效的,它们分别是UIVisualEffect、UIBlurEffect和UIVibrancyEffect。它们的继承层次如下所示:
1 |
|
UIVisualEffect
是一个继承自NSObject
的创建视觉效果的基类,然而这个类除了继承自NSObject
的属性和方法外,没有提供任何新的属性和方法。其主要目的是用于初始化UIVisualEffectView
,在这个初始化方法中可以传入UIBlurEffect
或者UIVibrancyEffect
对象。
一个UIBlurEffect
对象用于将blur
(毛玻璃)效果应用于UIVisualEffectView
视图下面的内容。如上面的示例所示。不过,这个对象的效果并不影响UIVisualEffectView
对象的contentView
中的内容。
UIBlurEffect
主要定义了三种效果,这些效果由枚举UIBlurEffectStyle
来确定,该枚举的定义如下:
1 |
|
与UIBlurEffect
不同的是,UIVibrancyEffect
主要用于放大和调整UIVisualEffectView
视图下面的内容的颜色,同时让UIVisualEffectView
的contentView
中的内容看起来更加生动。通常UIVibrancyEffect
对象是与UIBlurEffect
一起使用,主要用于处理在UIBlurEffect
特效上的一些显示效果。接上面的代码,我们看看在blur
的视图上添加一些新的特效,如下代码所示:
1 |
|
vibrancy
特效是取决于颜色值的。所有添加到contentView
的子视图都必须实现tintColorDidChange
方法并更新自己。需要注意的是,我们使用UIVibrancyEffect(forBlurEffect:)
方法创建UIVibrancyEffect
时,参数blurEffect
必须是我们想加效果的那个blurEffect
,否则可能不是我们想要的效果。
另外,UIVibrancyEffect
还提供了一个类方法notificationCenterVibrancyEffect
,其声明如下:
class func notificationCenterVibrancyEffect() -> UIVibrancyEffect!
这个方法创建一个用于通知中心的Today扩展的vibrancy特效。
参考
1 |
|