123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- //
- // VideoPickerPreviewCell.swift
- // MTImagePicker
- //
- // Created by Luo on 5/24/16.
- // Copyright © 2016 Luo. All rights reserved.
- //
- import UIKit
- import AVFoundation
- class VideoPickerPreviewCell: UICollectionViewCell {
- weak var controller: MTImagePickerPreviewController?
- var model: MTImagePickerModel!
- var avPlayer: AVPlayer!
- private var playerLayer: AVPlayerLayer!
- private var observer: AnyObject?
- @IBOutlet weak var btnPlay: UIButton!
- @IBOutlet weak var imageView: UIImageView!
- @IBOutlet weak var avPlayerView: UIView!
- override func awakeFromNib() {
- self.avPlayer = AVPlayer()
- self.playerLayer = AVPlayerLayer()
- self.playerLayer.player = self.avPlayer
- self.playerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
- self.playerLayer.frame = UIScreen.main.compatibleBounds
- self.avPlayerView.layer.insertSublayer(self.playerLayer, at: 0)
- let singTapGesture = UITapGestureRecognizer(target: self, action: #selector(VideoPickerPreviewCell.onVideoSingleTap(_:)))
- singTapGesture.numberOfTapsRequired = 1
- singTapGesture.numberOfTouchesRequired = 1
- self.addGestureRecognizer(singTapGesture)
- }
- override func prepareForReuse() {
- self.imageView.isHidden = false
- self.avPlayerView.isHidden = true
- self.btnPlay.isHidden = false
- }
- func initWithModel(model: MTImagePickerModel, controller: MTImagePickerPreviewController) {
- self.controller = controller
- self.model = model
- self.imageView.image = model.getPreviewImage()
- }
- //解决滚动卡顿,在滚动结束时替换AVPlayerItem
- func didScroll() {
- if let observer = self.observer {
- self.avPlayer.pause()
- self.avPlayer.removeTimeObserver(observer)
- self.observer = nil
- self.btnPlay.isHidden = false
- self.imageView.isHidden = false
- self.setTopAndBottomView(hidden: false)
- }
- self.setTopAndBottomView(hidden: false)
- }
- func resetLayer() {
- self.playerLayer.frame = UIScreen.main.compatibleBounds
- }
- func didEndScroll() {
- self.setTopAndBottomView(hidden: false)
- self.model.getImageAsync {
- image in
- self.imageView.image = image
- }
- //此处耗时,故放在滚动结束后调用
- if let playerItem = self.model.getAVPlayerItem() {
- self.avPlayer.replaceCurrentItem(with: playerItem)
- if let currentItem = self.avPlayer.currentItem {
- self.avPlayer.addBoundaryTimeObserver(forTimes: [currentItem.asset.duration as NSValue], queue: nil) {
- [unowned self] in
- DispatchQueue.main.async {
- self.avPlayer.seek(to: CMTime(value: 0, timescale: 30))
- self.btnPlay.isHidden = false
- self.setTopAndBottomView(hidden: false)
- }
- }
- }
- }
- }
- func resetLayer(frame: CGRect) {
- self.playerLayer.frame = frame
- }
- @objc func onVideoSingleTap(_ sernder: UITapGestureRecognizer) {
- self.playerPlayOrPause()
- }
- @IBAction func btnPlayTouch(_ sender: UIButton) {
- self.playerPlayOrPause()
- }
- func setTopAndBottomView(hidden: Bool) {
- if let controller = self.controller {
- controller.topView.isHidden = hidden
- controller.bottomView.isHidden = hidden
- }
- }
- func playerPlayOrPause() {
- if self.avPlayer.status == .readyToPlay {
- self.imageView.isHidden = true
- self.avPlayerView.isHidden = false
- if self.avPlayer.rate != 1.0 {
- self.btnPlay.isHidden = true
- self.avPlayer.play()
- self.setTopAndBottomView(hidden: true)
- } else {
- self.btnPlay.isHidden = false
- self.avPlayer.pause()
- self.setTopAndBottomView(hidden: false)
- }
- }
- }
- }
|