[Swift通天遁地]五、高级扩展-(11)图像加载Loading动画效果的自定义和缓存
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10260084.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
本文将演示图像加载Loading动画效果的自定义和缓存。
首先确保在项目中已经安装了所需的第三方库。
点击【Podfile】,查看安装配置文件。
1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'Kingfisher' 7 end
根据配置文件中的相关配置,安装第三方库。
然后点击打开【DemoApp.xcworkspace】项目文件。
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
1 import UIKit 2 //在当前的类文件中,引入已经安装的第三方类库 3 import Kingfisher 4 5 class ViewController: UIViewController { 6 7 //添加一个图像视图变量,作为当前类的属性 8 var imageView : UIImageView! 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 // Do any additional setup after loading the view, typically from a nib. 12 13 //设置根视图的背景颜色为橙色 14 self.view.backgroundColor = UIColor.orange 15 16 //从项目中读取一张图片 17 //创建一个图像视图,显示加载的图片 18 let image = UIImage(named: "background") 19 //设置图像视图的显示区域为当前的视图控制器 20 imageView = UIImageView(image: image) 21 //设置图像视图的边界 22 imageView.frame = self.view.bounds 23 //将图像视图添加到根视图 24 self.view.addSubview(imageView) 25 26 //添加一个图像按钮, 27 //当用户点击该按钮时,下载一张网络图片 28 let button = UIButton(frame: CGRect(x: 0, y: 528, width: 320, height: 40)) 29 //设置按钮的背景颜色为橙色 30 button.backgroundColor = UIColor.orange 31 //同时设置正常 32 button.setTitle("Load image again", for: .normal) 33 //给按钮控件绑定点击事件 34 button.addTarget(self, 35 action: #selector(ViewController.loadImage), 36 for: .touchUpInside) 37 //将按钮添加到根视图 38 self.view.addSubview(button) 39 } 40 41 //添加一个方法,用来响应按钮的点击事件 42 @objc func loadImage() 43 { 44 //初始化一个网址对象,作为网络图片的地址 45 let url = URL(string: "http://images.apple.com/v/iphone-7/d/images/films/product_large_2x.jpg") 46 //设置网络图片加载功能动画的样式,这里使用系统默认的动画Loaing 47 imageView.kf.indicatorType = .activity 48 //将图像视图的显示内容,修改为下载后的图片 49 imageView.kf.setImage(with: url) 50 51 52 //获得项目中动画资源的路径 53 let p = Bundle.main.path(forResource: "loading", ofType: "gif")! 54 //从项目中读取一张GIF动画 55 let data = try! Data(contentsOf: URL(fileURLWithPath: p)) 56 //设置在下载图片时,使用这张图片的素材,作为图片下载时的Loading动画。 57 imageView.kf.indicatorType = .image(imageData: data) 58 //将图像视图的显示内容,修改为下载后的图片 59 imageView.kf.setImage(with: url) 60 61 62 //调用扩展方法,下载并设置网络上的图片,同时设置下载进度 63 imageView.kf.setImage(with: url, progressBlock: 64 { 65 //通过已经接收的字节数和全部的字节数,计算图片下载进度的百分比 66 receivedSize, totalSize in 67 let percentage = (Float(receivedSize) / Float(totalSize)) * 100.0 68 print("downloading progress: \(percentage)%") 69 }) 70 //调用扩展方法,下载并设置网络上的图片, 71 //当下载完成之后,使用渐显的方式显示下载的图片 72 imageView.kf.setImage(with: url, options: [.transition(.fade(1.0))]) 73 74 //初始化一个圆角图片处理器,并设置圆角的半径为160 75 let processor = RoundCornerImageProcessor(cornerRadius: 160) 76 //调用扩展方法,下载并设置网络上的图片,下载并设置网络上的图片, 77 //同时给下载的图片添加圆角效果 78 imageView.kf.setImage(with: url, placeholder: nil, options: [.processor(processor)]) 79 80 //初始化一个模糊图像处理器,并设置模糊半径为4,接着再增加一个圆角处理器 81 let processor = BlurImageProcessor(blurRadius: 4) >> RoundCornerImageProcessor(cornerRadius: 20) 82 //调用扩展方法,下载并设置网络上的图片,同时给下载的图片添加模糊和圆角效果 83 imageView.kf.setImage(with: url, placeholder: nil, options: [.processor(processor)]) 84 85 //当再次给图像视图,设置同一个网络图片时,使用的是缓存的图片, 86 //如果需要重复下载图片。可以设置下载选项为强制刷新。 87 imageView.kf.setImage(with: url, options: [.forceRefresh]) 88 89 //如果需要从缓存中获取图片,可以设置下载的选项为来自缓存。 90 imageView.kf.setImage(with: url, options: [.onlyFromCache]) 91 92 93 //图片缓存的使用 94 //通过图片下载器,下载指定网址的图片 95 ImageDownloader.default.downloadImage(with: url!, options: [], progressBlock: nil) 96 { 97 (image, error, url, data) in 98 99 //将下载的图像转换成指定的图片格式 100 //let data = UIImagePNGRepresentation(image!) 101 102 //通过调用图片缓存全局对象的存储方法,将图片存储到本地,并设置存储的键值 103 ImageCache.default.store(image!, original: data, forKey: "AppleWatch", processorIdentifier: "", cacheSerializer: DefaultCacheSerializer.default, toDisk: false, completionHandler: nil) 104 105 //通过简化的方法,可以仅需指定键值,即可快速缓存图片 106 ImageCache.default.store(image!, forKey: "AppleWatch") 107 //通过键值可以快速判断在某键值下,是否存在缓存的图片。 108 print(ImageCache.default.isImageCached(forKey: "AppleWatch")) 109 } 110 111 //通过调用图片缓存全局对象的删除方法,可以删除指定键值的缓存图像 112 ImageCache.default.removeImage(forKey: "AppleWatch") 113 //通过调用图片缓存全局对象的删除磁盘缓存方法,可以删除磁盘上的所有缓存图片 114 ImageCache.default.clearDiskCache() 115 //清除内存缓存方法,可以删除在内存中缓存的所有图片 116 ImageCache.default.clearMemoryCache() 117 //清除过期的磁盘缓存方法,可以删除超过指定期限的,缓存在磁盘上的图片 118 ImageCache.default.cleanExpiredDiskCache() 119 120 //设置缓存区域的大小为50M 121 ImageCache.default.maxDiskCacheSize = 50 * 1024 * 1024 122 //设置缓存的期限为7天, 123 //超过7天的缓存图片将被删除 124 ImageCache.default.maxCachePeriodInSecond = 60 * 60 * 24 * 7 125 //设置图片下载的超时时限为30秒,当超过30秒时,下载任务失败 126 ImageDownloader.default.downloadTimeout = 30.0 127 } 128 129 override func didReceiveMemoryWarning() { 130 super.didReceiveMemoryWarning() 131 // Dispose of any resources that can be recreated. 132 } 133 }