YapImageManager 1.0.8

YapImageManager 1.0.8

测试已测试
Lang语言 SwiftSwift
许可证 BSD
发布最后发布2017年9月
SwiftSwift 版本3.1
SPM支持 SPM

Emory Al-ImamTrevor Stout 维护。



 
依赖项
Alamofire~> 4.4
CocoaLumberjack/Swift~> 3.1
YapDatabase~> 3.0
 

  • Yap Studios

特性

  • [x] 异步图像下载,具有优先级队列
  • [x] 使用 YapDatabase(SQLite)进行高级内存和数据库缓存
  • [x] 每个请求确保只下载一张图像
  • [x] 使用票据取消挂起请求
  • [x] 在后台进行图像解码、缩放和过滤
  • [x] 自定义图像过滤器
  • [x] 使用过滤器渲染渐变和更多图像
  • [x] 高性能滚动
  • [x] 根据可达性更改自动暂停和恢复下载队列
  • [x] 完全用 Swift 编写

路线图功能

  • [x] 可以捕获原始解码图像数据流的宽度和高度,在图像下载之前通过通知实现,适用于 gif、png 和 jpeg 格式。这对于在表格视图或集合视图中显示全宽图像并保持正确的宽高比非常有用,因为它允许您计算单元格高度并在可见图像下载的同时几乎立即更新布局。
  • [x] 在整个 GIF 下载之前,返回 GIF 的第一帧图像。
  • [x] 将 GIF 转换为 MP4 文件,以实现更好的内存管理和滚动性能。

要求

  • iOS 10.0+ / tvOS 9.0+
  • Xcode 8.0+
  • Swift 3.0+

使用方法

请求全尺寸图像

以下是如何请求全尺寸、解码图像并在 UIImageView 上设置图像响应的示例。

  YapImageManager.sharedInstance.asyncImage(forURLString: URLString) { [weak self] response in
    if let image = response.image {
      self?.imageView.image = image
    }
  }

请求特定最大尺寸的图像

以下是如何获取特定尺寸的解码图像并在 UIImageView 上设置图像响应的示例。请求与您的 UIImageView 坐标界限匹配的图像大小可以提高滚动性能,并且避免在 GPU 上进行缩放。解码并缩放的图像将缓存在内存中,以减少 CPU 时间。

  YapImageManager.sharedInstance.asyncImage(forURLString: URLString, size: self.bounds.size) { [weak self] response in
    if let image = response.image {
      self?.imageView.image = image
    }
  }

请求带有票证的图片

请求带有票证的图片对于使用具有回收单元格的 UITableViewUICollectionView 非常重要。当一个单元格被回收时,取消票证确保之前的图片请求不会完成并更新带有不同图片请求的新的单元格的图片。这也会通过取消在快速滚动时不再可见的单元格的任何不需要的下载请求来提高性能。以下是一个示例。

ticket 成员变量添加到您的类中...

private var ticket: ImageRequestTicket?

请求图片,保存票证...

  ticket = YapImageManager.sharedInstance.asyncImage(forURLString: URLString, size: self.bounds.size) { [weak self] response in
    
    if response.ticket == self?.ticket {
      self?.ticket = nil
      
      if let image = response.image {
        self?.imageView.image = image
      }
    }
  }

prepareForReuse 中取消票证...

  override func prepareForReuse() {
    super.prepareForReuse()
    
    if let ticket = self.ticket {
      YapImageManager.sharedInstance.cancelImageRequest(forTicket: ticket)
      self.ticket = nil
    }
  }

以下是一个示例输出。

Sized Images

带有滤镜请求图片

要渲染一个或多个图片滤镜的图片,只需在请求中通过一个包含 YapImageFilter 的数组。YapImageManager 有以下内置滤镜

  • YapAspectFillFilter - 以内容模式填充方式绘制原图
  • YapGradientFilter - 从指定的 startColor 渲染渐变到 endColor
  • YapColorFilter - 绘制背景颜色,或者根据是否包含 YapAspectFillFilter 绘制覆盖颜色
  • YapOverlayImageFilter - 绘制由 overlayImage 指定的自定义 UIImage

您可以通过采用协议 YapImageFilter 来创建自己的自定义滤镜。

以下是为图片添加渐变覆盖的示例。在使用滤镜时,请确保至少有一个滤镜渲染原始图片,例如使用 YapAspectFillFilter

  let filters: [YapImageFilter] = [YapAspectFillFilter(), YapGradientFilter(startColor: UIColor.black.withAlphaComponent(0.5), endColor: .clear)]
  YapImageManager.sharedInstance.asyncImage(forURLString: URLString, size: self.bounds.size, filters: filters) { [weak self] response in
    if let image = response.image {
      self?.imageView.image = image
    }
  }

以下是一个示例输出。

Sized Images with Gradient

渲染新图片,例如渐变

要使用滤镜渲染新图片,例如渐变,请使用 `createImage` 方法,传入所需大小和一个包含 YapImageFilter 的数组。以下示例生成一个简单的覆盖渐变。

  let red = UIColor(red: 0.93, green:0.09, blue:0.31, alpha:1.0)
  let gradient = YapGradientFilter(startColor: red, endColor: .clear)    
  YapImageManager.sharedInstance.createImage(withSize: self.bounds.size, filters: [gradient]) { [weak self] image in
    self?.imageView.image = image
  }

以下是一个示例输出。

Gradient Images

致谢

YapImageManager 由 Yap Studios 所有并维护。