LLAnimatableImageView.swift 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //
  2. // LLAnimatableImageView.swift
  3. import UIKit
  4. class LLAnimatableImageView: UIImageView {
  5. var cache = LLCache.shared
  6. private var url: URL?
  7. private var worker: DispatchWorkItem?
  8. private var activityIndicator: UIActivityIndicatorView = {
  9. let ai = UIActivityIndicatorView()
  10. ai.translatesAutoresizingMaskIntoConstraints = false
  11. ai.hidesWhenStopped = true
  12. return ai
  13. }()
  14. init() {
  15. super.init(frame: .zero)
  16. self.addSubview(activityIndicator)
  17. NSLayoutConstraint.activate([
  18. activityIndicator.centerXAnchor.constraint(equalTo: self.centerXAnchor),
  19. activityIndicator.centerYAnchor.constraint(equalTo: self.centerYAnchor)
  20. ])
  21. }
  22. required init?(coder: NSCoder) {
  23. fatalError("init(coder:) has not been implemented")
  24. }
  25. func loadGifFromUrl(urlString: String) {
  26. guard let url = URL(string: urlString) else { return }
  27. self.url = url
  28. self.cancelAndClear()
  29. self.cache.retreiveDataFromUrl(url: url) {[weak self] gifImage in
  30. gifImage?.prepareForDisplay(completionHandler: { preparedImage in
  31. DispatchQueue.main.async {
  32. self?.activityIndicator.stopAnimating()
  33. self?.image = preparedImage
  34. }
  35. })
  36. }
  37. }
  38. /// Sets the current image to nil
  39. func cancelAndClear() {
  40. self.activityIndicator.startAnimating()
  41. self.image = nil
  42. cache.cancelTaskFor(url: url!)
  43. }
  44. }