首先先创建一个ImageView好方便来展示高斯模糊效果。
声明一个ImageView
imageView = UIImageView(image: UIImage(named: "happy"))
在viewDidLoad中创建一个方法,方法里面设置其大小,并且将其放在View的中间,然后将其添加为View的子view。
imageView.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
imageView.center = view.center
view.addSubview(imageView)
运行后发现图片的比例不是非常正确,并且大小也超过了给予的大小,添加代码:
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
给view添加一个点击手势
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
添加打印方法确认添加成功。
@objc func handleTap() {
print("tapped")
确认之后,给图片增加一个放大的效果。
UIView.animate(withDuration: 2) {
self.imageView.transform = CGAffineTransform(scaleX: 2, y: 2)
这样做的话就无法控制想要放大的倍数,添加一个slider。添加一个setUpSlider设置好slider,然后在viewDIdLoad 中调用setUpSlider。
func setUpSlider() {
let slider = UISlider()
view.addSubview(slider)
slider.frame = CGRect(x: view.center.x - 100 , y: view.center.y + 120 , width: 200, height: 20)
slider.addTarget(self, action: #selector(handleSliderChange), for: .valueChanged)
这样就可以获取到slider里面的值了。
@objc func handleSliderChange(slider:UISlider) {
print(slider.value)
接下来声明一个UIViewPropertyAnimator属性,这是一个为视图的更改制作动画并允许动态修改这些动画的类。
let animator = UIViewPropertyAnimator(duration: 0.5, curve: .linear, animations: nil)
在viewDidLoad中为animator添加动画
animator.addAnimations {
self.imageView.transform = CGAffineTransform(scaleX: 4, y: 4)
在handleSliderChange中修改animator的fractionComplete,fractionComplete 代表动画的完成进度。
@objc func handleSliderChange(slider:UISlider) {
animator.fractionComplete = CGFloat(slider.value)
到这里图片的大小就会随着进度条的拖动而变化了。接下来要添加高斯模糊。
声明一个blurEffectView属性。
let blurEffectView = UIVisualEffectView(effect: nil)
在animator.addAnimations中添加
self.blurEffectView.effect = UIBlurEffect(style: .regular)
设置好frame,添加为view的子view,在viewDidLoad中调用。
func setUpBlurEffect() {
blurEffectView.frame = view.frame
view.addSubview(blurEffectView)
这样一个能跟着slider变化而改变大小和高斯模糊效果的图片就做好了
import UIKit
class ViewController: UIViewController {
let imageView = UIImageView(image: UIImage(named: "happy"))
let animator = UIViewPropertyAnimator(duration: 0.5, curve: .linear, animations: nil)
let blurEffectView = UIVisualEffectView(effect: nil)
override func viewDidLoad() {
super.viewDidLoad()
setUpImageView()
setUpBlurEffect()
animator.addAnimations {
self.imageView.transform = CGAffineTransform(scaleX: 4, y: 4)
self.blurEffectView.effect = UIBlurEffect(style: .regular)
setUpSlider()
func setUpBlurEffect() {
blurEffectView.frame = view.frame
view.addSubview(blurEffectView)
func setUpSlider() {
let slider = UISlider()
view.addSubview(slider)
slider.frame = CGRect(x: view.center.x - 100 , y: view.center.y + 120 , width: 200, height: 20)
slider.addTarget(self, action: #selector(handleSliderChange), for: .valueChanged)
@objc func handleSliderChange(slider:UISlider) {
animator.fractionComplete = CGFloat(slider.value)
@objc func handleTap() {
UIView.animate(withDuration: 2) {
self.imageView.transform = CGAffineTransform(scaleX: 2, y: 2)
fileprivate func setUpImageView() {
imageView.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
imageView.center = view.center
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
view.addSubview(imageView)
复制代码