iOSUIVisualEffectView視圖
在iOS 8后周偎,蘋(píng)果開(kāi)放了不少創(chuàng)建特效的接口,其中就包括創(chuàng)建毛玻璃(blur)的接口撑帖。
通常要想創(chuàng)建一個(gè)特殊效果(如blur效果)蓉坎,可以創(chuàng)建一個(gè)UIVisualEffectView視圖對(duì)象,這個(gè)對(duì)象提供了一種簡(jiǎn)單的方式來(lái)實(shí)現(xiàn)復(fù)雜的視覺(jué)效果胡嘿。這個(gè)可以把這個(gè)對(duì)象看作是效果的一個(gè)容器蛉艾,實(shí)際的效果會(huì)影響到該視圖對(duì)象底下的內(nèi)容,或者是添加到該視圖對(duì)象的contentView中的內(nèi)容衷敌。
我們舉個(gè)例子來(lái)看看如果使用UIVisualEffectView:
let bgView: UIImageView = UIImageView(image: UIImage(named: "visual"))
bgView.frame = self.view.bounds
self.view.addSubview(bgView)
let blurEffect: UIBlurEffect = UIBlurEffect(style: .Light)
let blurView: UIVisualEffectView = UIVisualEffectView(effect: blurEffect)
blurView.frame = CGRectMake(50.0, 50.0, self.view.frame.width - 100.0, 200.0)
self.view.addSubview(blurView)
這段代碼是在當(dāng)前視圖控制器上添加了一個(gè)UIImageView作為背景圖勿侯。然后在視圖的一小部分中使用了blur效果。
我們可以看到UIVisualEffectView還是非常簡(jiǎn)單的缴罗。需要注意是的助琐,不應(yīng)該直接添加子視圖到UIVisualEffectView視圖中,而是應(yīng)該添加到UIVisualEffectView對(duì)象的contentView中面氓。
另外兵钮,盡量避免將UIVisualEffectView對(duì)象的alpha值設(shè)置為小于1.0的值,因?yàn)閯?chuàng)建半透明的視圖會(huì)導(dǎo)致系統(tǒng)在離屏渲染時(shí)去對(duì)UIVisualEffectView對(duì)象及所有的相關(guān)的子視圖做混合操作舌界。這不但消耗CPU/GPU掘譬,也可能會(huì)導(dǎo)致許多效果顯示不正確或者根本不顯示。
我們?cè)谏厦婵吹缴氚瑁跏蓟粋€(gè)UIVisualEffectView對(duì)象的方法是UIVisualEffectView(effect: blurEffect)葱轩,其定義如下:
1
init(effect effect: UIVisualEffect)
這個(gè)方法的參數(shù)是一個(gè)UIVisualEffect對(duì)象。我們查看官方文檔藐握,可以看到在UIKit中靴拱,定義了幾個(gè)專(zhuān)門(mén)用來(lái)創(chuàng)建視覺(jué)特效的,它們分別是UIVisualEffect猾普、UIBlurEffect和UIVibrancyEffect袜炕。它們的繼承層次如下所示:
NSObject
| -- UIVisualEffect
| -- UIBlurEffect
| -- UIVibrancyEffect
UIVisualEffect是一個(gè)繼承自NSObject的創(chuàng)建視覺(jué)效果的基類(lèi),然而這個(gè)類(lèi)除了繼承自NSObject的屬性和方法外抬闷,沒(méi)有提供任何新的屬性和方法妇蛀。其主要目的是用于初始化UIVisualEffectView,在這個(gè)初始化方法中可以傳入U(xiǎn)IBlurEffect或者UIVibrancyEffect對(duì)象笤成。
一個(gè)UIBlurEffect對(duì)象用于將blur(毛玻璃)效果應(yīng)用于UIVisualEffectView視圖下面的內(nèi)容评架。如上面的示例所示。不過(guò)炕泳,這個(gè)對(duì)象的效果并不影響UIVisualEffectView對(duì)象的contentView中的內(nèi)容纵诞。
UIBlurEffect主要定義了三種效果,這些效果由枚舉UIBlurEffectStyle來(lái)確定培遵,該枚舉的定義如下:
enum UIBlurEffectStyle : Int {
case ExtraLight
case Light
case Dark
}
其主要是根據(jù)色調(diào)(hue)來(lái)確定特效視圖與底部視圖的混合浙芙。
與UIBlurEffect不同的是,UIVibrancyEffect主要用于放大和調(diào)整UIVisualEffectView視圖下面的內(nèi)容的顏色籽腕,同時(shí)讓UIVisualEffectView的contentView中的內(nèi)容看起來(lái)更加生動(dòng)嗡呼。通常UIVibrancyEffect對(duì)象是與UIBlurEffect一起使用,主要用于處理在UIBlurEffect特效上的一些顯示效果皇耗。接上面的代碼南窗,我們看看在blur的視圖上添加一些新的特效,如下代碼所示:
let vibrancyView: UIVisualEffectView = UIVisualEffectView(effect: UIVibrancyEffect(forBlurEffect: blurEffect))
vibrancyView.setTranslatesAutoresizingMaskIntoConstraints(false)
blurView.contentView.addSubview(vibrancyView)
var label: UILabel = UILabel()
label.setTranslatesAutoresizingMaskIntoConstraints(false)
label.text = "Vibrancy Effect"
label.font = UIFont(name: "HelveticaNeue-Bold", size: 30)
label.textAlignment = .Center
label.textColor = UIColor.whiteColor()
vibrancyView.contentView.addSubview(label)
vibrancy特效是取決于顏色值的郎楼。所有添加到contentView的子視圖都必須實(shí)現(xiàn)tintColorDidChange方法并更新自己万伤。需要注意的是,我們使用UIVibrancyEffect(forBlurEffect:)方法創(chuàng)建UIVibrancyEffect時(shí)呜袁,參數(shù)blurEffect必須是我們想加效果的那個(gè)blurEffect敌买,否則可能不是我們想要的效果。
另外阶界,UIVibrancyEffect還提供了一個(gè)類(lèi)方法notificationCenterVibrancyEffect虹钮,其聲明如下:
class func notificationCenterVibrancyEffect() -> UIVibrancyEffect!
這個(gè)方法創(chuàng)建一個(gè)用于通知中心的Today擴(kuò)展的vibrancy特效。