VideoPickerPreviewCell.swift 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. //
  2. // VideoPickerPreviewCell.swift
  3. // MTImagePicker
  4. //
  5. // Created by Luo on 5/24/16.
  6. // Copyright © 2016 Luo. All rights reserved.
  7. //
  8. import UIKit
  9. import AVFoundation
  10. class VideoPickerPreviewCell: UICollectionViewCell {
  11. weak var controller: MTImagePickerPreviewController?
  12. var model: MTImagePickerModel!
  13. var avPlayer: AVPlayer!
  14. private var playerLayer: AVPlayerLayer!
  15. private var observer: AnyObject?
  16. @IBOutlet weak var btnPlay: UIButton!
  17. @IBOutlet weak var imageView: UIImageView!
  18. @IBOutlet weak var avPlayerView: UIView!
  19. override func awakeFromNib() {
  20. self.avPlayer = AVPlayer()
  21. self.playerLayer = AVPlayerLayer()
  22. self.playerLayer.player = self.avPlayer
  23. self.playerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
  24. self.playerLayer.frame = UIScreen.main.compatibleBounds
  25. self.avPlayerView.layer.insertSublayer(self.playerLayer, at: 0)
  26. let singTapGesture = UITapGestureRecognizer(target: self, action: #selector(VideoPickerPreviewCell.onVideoSingleTap(_:)))
  27. singTapGesture.numberOfTapsRequired = 1
  28. singTapGesture.numberOfTouchesRequired = 1
  29. self.addGestureRecognizer(singTapGesture)
  30. }
  31. override func prepareForReuse() {
  32. self.imageView.isHidden = false
  33. self.avPlayerView.isHidden = true
  34. self.btnPlay.isHidden = false
  35. }
  36. func initWithModel(model: MTImagePickerModel, controller: MTImagePickerPreviewController) {
  37. self.controller = controller
  38. self.model = model
  39. self.imageView.image = model.getPreviewImage()
  40. }
  41. //解决滚动卡顿,在滚动结束时替换AVPlayerItem
  42. func didScroll() {
  43. if let observer = self.observer {
  44. self.avPlayer.pause()
  45. self.avPlayer.removeTimeObserver(observer)
  46. self.observer = nil
  47. self.btnPlay.isHidden = false
  48. self.imageView.isHidden = false
  49. self.setTopAndBottomView(hidden: false)
  50. }
  51. self.setTopAndBottomView(hidden: false)
  52. }
  53. func resetLayer() {
  54. self.playerLayer.frame = UIScreen.main.compatibleBounds
  55. }
  56. func didEndScroll() {
  57. self.setTopAndBottomView(hidden: false)
  58. self.model.getImageAsync {
  59. image in
  60. self.imageView.image = image
  61. }
  62. //此处耗时,故放在滚动结束后调用
  63. if let playerItem = self.model.getAVPlayerItem() {
  64. self.avPlayer.replaceCurrentItem(with: playerItem)
  65. if let currentItem = self.avPlayer.currentItem {
  66. self.avPlayer.addBoundaryTimeObserver(forTimes: [currentItem.asset.duration as NSValue], queue: nil) {
  67. [unowned self] in
  68. DispatchQueue.main.async {
  69. self.avPlayer.seek(to: CMTime(value: 0, timescale: 30))
  70. self.btnPlay.isHidden = false
  71. self.setTopAndBottomView(hidden: false)
  72. }
  73. }
  74. }
  75. }
  76. }
  77. func resetLayer(frame: CGRect) {
  78. self.playerLayer.frame = frame
  79. }
  80. @objc func onVideoSingleTap(_ sernder: UITapGestureRecognizer) {
  81. self.playerPlayOrPause()
  82. }
  83. @IBAction func btnPlayTouch(_ sender: UIButton) {
  84. self.playerPlayOrPause()
  85. }
  86. func setTopAndBottomView(hidden: Bool) {
  87. if let controller = self.controller {
  88. controller.topView.isHidden = hidden
  89. controller.bottomView.isHidden = hidden
  90. }
  91. }
  92. func playerPlayOrPause() {
  93. if self.avPlayer.status == .readyToPlay {
  94. self.imageView.isHidden = true
  95. self.avPlayerView.isHidden = false
  96. if self.avPlayer.rate != 1.0 {
  97. self.btnPlay.isHidden = true
  98. self.avPlayer.play()
  99. self.setTopAndBottomView(hidden: true)
  100. } else {
  101. self.btnPlay.isHidden = false
  102. self.avPlayer.pause()
  103. self.setTopAndBottomView(hidden: false)
  104. }
  105. }
  106. }
  107. }