iOS 开发中有时会涉及到模糊效果的处理,UIKit 原生有个 UIVisualEffectView
可以支持对视图进行模糊效果处理,但设计师有时会以为原生的 blur 效果过重,想要轻一些,那怎么处理呢?固然,能够选择一些第三方或者本身实现对视图的模糊处理,若是不能那么麻烦呢?能够采用 UIViewPropertyAnimator
达到该要求。swift
// 如下代码可直接在`Playground`上运行看到效果
class BlurDemoViewController: UIViewController {
let imageView = UIImageView()
let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
var animator: UIViewPropertyAnimator?
override func viewDidLoad() {
super.viewDidLoad()
imageView.frame = view.bounds
imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
imageView.contentMode = .scaleAspectFill
view.addSubview(imageView)
effectView.frame = view.bounds
effectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(effectView)
// 核心代码,控制 animator 的 fractionComplete 值便可控制 blur 的级别,另外, duration 在这并不重要,由于咱们将手动设置 animator 的完成度
animator = UIViewPropertyAnimator(duration: 1, curve: .linear) {
// 这里是核心,这样控制 fractionComplete 就能够控制视图的模糊效果在系统默认级别和无模糊效果之间过渡了
self.effectView.effect = nil
}
// Slider 用于控制模糊效果级别的演示
let slider = UISlider()
slider.frame.origin.x = 20
slider.frame.origin.y = view.frame.size.height - slider.frame.size.height - 20
slider.frame.size.width = view.frame.size.width - 40
slider.autoresizingMask = [.flexibleWidth, .flexibleTopMargin]
slider.addTarget(self, action: #selector(sliderValueChanged), for: .valueChanged)
view.addSubview(slider)
}
@objc private func sliderValueChanged(sender: UISlider) {
// 控制 animator 的完成度以达到控制 Blur 级别的效果
animator?.fractionComplete = CGFloat(sender.value)
}
}
let vc = BlurDemoViewController()
vc.imageView.image = UIImage(named: "Test")
//vc.effectView.effect = UIBlurEffect(style: .dark)
//vc.effectView.effect = UIBlurEffect(style: .extraLight)
import PlaygroundSupport
PlaygroundPage.current.liveView = vc
复制代码
一样的思路,也能够尝试着用到其余视图属性效果上。ide