LLAnimatableImageView.swift 1.7 KB

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