Swift - 实现毛玻璃效果(Blur、模糊、虚化背景元素)
苹果从 iOS 7 起,大量使用了毛玻璃效果。比如上拉的控制中心就使用了毛玻璃效果。但当时还未向开发者公开提供毛玻璃效果的API,因此开发者只能去自己实现毛玻璃效果或者找第三方类库解决。
后来到了 iOS 8,SDK中直接提供了 UIBlurEffect 类与 UIVisualEffectView 类,配合使用这两个类可以轻松实现毛玻璃效果。
1,准备工作
假设我们在页面视图上放置了一个 imageView。下面演示如何在其之上添加毛玻璃效果。
2,使用UIBlurEffect、UIVisualEffectView实现毛玻璃效果
(1)创建一个 UIBlurEffect 类的实例,并指定某一种毛玻璃效果样式。
(2)创建 UIVisualEffectView 类的实例,这个可以称它为模糊视图。将前面创建的 UIBlurEffect 类的实例应用到这个模糊视图上。
(3)将 UIVisualEffectView 类的实例(模糊视图)置于待毛玻璃化的视图之上即可。在其下方的所有视图都会有模糊效果。
3,三种模糊效果
除了上面使用的 Light 样式。UIBlurEffect 一共定义了三种效果,这些效果由枚举 UIBlurEffectStyle 来确定,
5,源码下载:hangge_1135.zip
后来到了 iOS 8,SDK中直接提供了 UIBlurEffect 类与 UIVisualEffectView 类,配合使用这两个类可以轻松实现毛玻璃效果。
1,准备工作
假设我们在页面视图上放置了一个 imageView。下面演示如何在其之上添加毛玻璃效果。
(1)创建一个 UIBlurEffect 类的实例,并指定某一种毛玻璃效果样式。
(2)创建 UIVisualEffectView 类的实例,这个可以称它为模糊视图。将前面创建的 UIBlurEffect 类的实例应用到这个模糊视图上。
(3)将 UIVisualEffectView 类的实例(模糊视图)置于待毛玻璃化的视图之上即可。在其下方的所有视图都会有模糊效果。
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //首先创建一个模糊效果 let blurEffect = UIBlurEffect(style: .Light) //接着创建一个承载模糊效果的视图 let blurView = UIVisualEffectView(effect: blurEffect) //设置模糊视图的大小(全屏) blurView.frame.size = CGSize(width: view.frame.width, height: view.frame.height) //添加模糊视图到页面view上(模糊视图下方都会有模糊效果) self.view.addSubview(blurView) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
除了上面使用的 Light 样式。UIBlurEffect 一共定义了三种效果,这些效果由枚举 UIBlurEffectStyle 来确定,
分别是:ExtraLight、Light、Dark。
我们可以根据色调(hue)来确定特效视图与底部视图的混合样式,使其更符合我们的页面风格。
4,添加Vibrancy
通过模糊背景,我们可以让前景文字或其它视图元素显得更加突出。
而苹果在其之上又引入了 UIVibrancyEffect。UIVibrancyEffect 主要用于放大和调整 UIVisualEffectView 视图下面的内容的颜色,同时让 UIVisualEffectView 的 contentView 中的内容看起来更加生动。
通常 UIVibrancyEffect 对象是与 UIBlurEffect 一起使用,下面对页面上的文本标签做 Vibrancy 效果,可以看到文本标签在屏幕上显得更为舒适。
将 blurEffect 的样式设为 .Dark 的效果:
我们可以根据色调(hue)来确定特效视图与底部视图的混合样式,使其更符合我们的页面风格。
通过模糊背景,我们可以让前景文字或其它视图元素显得更加突出。
而苹果在其之上又引入了 UIVibrancyEffect。UIVibrancyEffect 主要用于放大和调整 UIVisualEffectView 视图下面的内容的颜色,同时让 UIVisualEffectView 的 contentView 中的内容看起来更加生动。
通常 UIVibrancyEffect 对象是与 UIBlurEffect 一起使用,下面对页面上的文本标签做 Vibrancy 效果,可以看到文本标签在屏幕上显得更为舒适。
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //首先创建一个模糊效果 let blurEffect = UIBlurEffect(style: .Light) //接着创建一个承载模糊效果的视图 let blurView = UIVisualEffectView(effect: blurEffect) //设置模糊视图的大小(全屏) blurView.frame.size = CGSize(width: view.frame.width, height: view.frame.height) //创建并添加vibrancy视图 let vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(forBlurEffect: blurEffect)) vibrancyView.frame.size = CGSize(width: view.frame.width, height: view.frame.height) blurView.contentView.addSubview(vibrancyView) //将文本标签添加到vibrancy视图中 let label=UILabel(frame:CGRectMake(10,20, 300, 100)) label.text = "hangge.com" label.font = UIFont(name: "HelveticaNeue-Bold", size: 40) label.textAlignment = .Center label.textColor = UIColor.whiteColor() vibrancyView.contentView.addSubview(label) self.view.addSubview(blurView) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
将 blurEffect 的样式设为 .Dark 的效果:
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //首先创建一个模糊效果 let blurEffect = UIBlurEffect(style: .Dark) //接着创建一个承载模糊效果的视图 let blurView = UIVisualEffectView(effect: blurEffect) //设置模糊视图的大小(全屏) blurView.frame.size = CGSize(width: view.frame.width, height: view.frame.height) //创建并添加vibrancy视图 let vibrancyView = UIVisualEffectView(effect: UIVibrancyEffect(forBlurEffect: blurEffect)) vibrancyView.frame.size = CGSize(width: view.frame.width, height: view.frame.height) blurView.contentView.addSubview(vibrancyView) //将文本标签添加到vibrancy视图中 let label=UILabel(frame:CGRectMake(10,20, 300, 100)) label.text = "hangge.com" label.font = UIFont(name: "HelveticaNeue-Bold", size: 40) label.textAlignment = .Center label.textColor = UIColor.whiteColor() vibrancyView.contentView.addSubview(label) self.view.addSubview(blurView) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
5,源码下载:hangge_1135.zip
航哥 如果我想让四周都模糊,但是中间有一小块是清晰的 怎么做呢?
谢谢站长的分享,解决我大问题
航哥辛苦啦
航哥的swift系列真不错,受益不小。航哥,希望你继续保持更新啊,我们挺你
实用!不过swift快3.0了。。站长辛苦了!