TLPhotoCollectionViewCell.swift 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. //
  2. // TLPhotoCollectionViewCell.swift
  3. // TLPhotosPicker
  4. //
  5. // Created by wade.hawk on 2017. 5. 3..
  6. // Copyright © 2017년 wade.hawk. All rights reserved.
  7. //
  8. import UIKit
  9. import PhotosUI
  10. open class TLPlayerView: UIView {
  11. @objc open var player: AVPlayer? {
  12. get {
  13. return playerLayer.player
  14. }
  15. set {
  16. playerLayer.player = newValue
  17. }
  18. }
  19. @objc open var playerLayer: AVPlayerLayer {
  20. return layer as! AVPlayerLayer
  21. }
  22. // Override UIView property
  23. override open class var layerClass: AnyClass {
  24. return AVPlayerLayer.self
  25. }
  26. }
  27. open class TLPhotoCollectionViewCell: UICollectionViewCell {
  28. private var observer: NSObjectProtocol?
  29. @IBOutlet open var imageView: UIImageView?
  30. @IBOutlet open var playerView: TLPlayerView?
  31. @IBOutlet open var livePhotoView: PHLivePhotoView?
  32. @IBOutlet open var liveBadgeImageView: UIImageView?
  33. @IBOutlet open var durationView: UIView?
  34. @IBOutlet open var videoIconImageView: UIImageView?
  35. @IBOutlet open var durationLabel: UILabel?
  36. @IBOutlet open var indicator: UIActivityIndicatorView?
  37. @IBOutlet open var selectedView: UIView?
  38. @IBOutlet open var selectedHeight: NSLayoutConstraint?
  39. @IBOutlet open var orderLabel: UILabel?
  40. @IBOutlet open var orderBgView: UIView?
  41. var configure = TLPhotosPickerConfigure() {
  42. didSet {
  43. self.selectedView?.layer.borderColor = self.configure.selectedColor.cgColor
  44. self.orderBgView?.backgroundColor = self.configure.selectedColor
  45. self.videoIconImageView?.image = self.configure.videoIcon
  46. }
  47. }
  48. @objc open var isCameraCell = false
  49. open var duration: TimeInterval? {
  50. didSet {
  51. guard let duration = self.duration else { return }
  52. self.selectedHeight?.constant = -10
  53. self.durationLabel?.text = timeFormatted(timeInterval: duration)
  54. }
  55. }
  56. @objc open var player: AVPlayer? = nil {
  57. didSet {
  58. if self.configure.autoPlay == false { return }
  59. if self.player == nil {
  60. self.playerView?.playerLayer.player = nil
  61. if let observer = self.observer {
  62. NotificationCenter.default.removeObserver(observer)
  63. }
  64. }else {
  65. self.playerView?.playerLayer.player = self.player
  66. self.observer = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: nil, using: { [weak self] (_) in
  67. DispatchQueue.main.async {
  68. guard let `self` = self else { return }
  69. self.player?.seek(to: CMTime.zero)
  70. self.player?.play()
  71. self.player?.isMuted = self.configure.muteAudio
  72. }
  73. })
  74. }
  75. }
  76. }
  77. @objc open var selectedAsset: Bool = false {
  78. willSet(newValue) {
  79. self.selectedView?.isHidden = !newValue
  80. self.durationView?.backgroundColor = newValue ? self.configure.selectedColor : UIColor(red: 0, green: 0, blue: 0, alpha: 0.6)
  81. if !newValue {
  82. self.orderLabel?.text = ""
  83. }
  84. }
  85. }
  86. @objc open func timeFormatted(timeInterval: TimeInterval) -> String {
  87. let seconds: Int = lround(timeInterval)
  88. var hour: Int = 0
  89. var minute: Int = Int(seconds/60)
  90. let second: Int = seconds % 60
  91. if minute > 59 {
  92. hour = minute / 60
  93. minute = minute % 60
  94. return String(format: "%d:%d:%02d", hour, minute, second)
  95. } else {
  96. return String(format: "%d:%02d", minute, second)
  97. }
  98. }
  99. @objc open func popScaleAnim() {
  100. UIView.animate(withDuration: 0.1, animations: {
  101. self.transform = CGAffineTransform(scaleX: 1.05, y: 1.05)
  102. }) { _ in
  103. UIView.animate(withDuration: 0.1, animations: {
  104. self.transform = CGAffineTransform(scaleX: 1, y: 1)
  105. })
  106. }
  107. }
  108. @objc open func update(with phAsset: PHAsset) {
  109. }
  110. @objc open func selectedCell() {
  111. }
  112. @objc open func willDisplayCell() {
  113. }
  114. @objc open func endDisplayingCell() {
  115. }
  116. @objc func stopPlay() {
  117. if let player = self.player {
  118. player.pause()
  119. self.player = nil
  120. }
  121. self.livePhotoView?.isHidden = true
  122. self.livePhotoView?.stopPlayback()
  123. self.livePhotoView?.delegate = nil
  124. }
  125. deinit {
  126. // print("deinit TLPhotoCollectionViewCell")
  127. }
  128. override open func awakeFromNib() {
  129. super.awakeFromNib()
  130. self.playerView?.playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
  131. self.livePhotoView?.isHidden = true
  132. self.durationView?.isHidden = true
  133. self.selectedView?.isHidden = true
  134. self.selectedView?.layer.borderWidth = 10
  135. self.selectedView?.layer.cornerRadius = 15
  136. self.orderBgView?.layer.cornerRadius = 2
  137. self.videoIconImageView?.image = self.configure.videoIcon
  138. }
  139. override open func prepareForReuse() {
  140. super.prepareForReuse()
  141. stopPlay()
  142. self.livePhotoView?.isHidden = true
  143. self.livePhotoView?.delegate = nil
  144. self.durationView?.isHidden = true
  145. self.durationView?.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.6)
  146. self.selectedHeight?.constant = 10
  147. self.selectedAsset = false
  148. }
  149. }