Skip to content

Instantly share code, notes, and snippets.

@chetanankola
Created October 10, 2018 01:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chetanankola/a9009f25f80f4384f2f11822d1f5e70a to your computer and use it in GitHub Desktop.
Save chetanankola/a9009f25f80f4384f2f11822d1f5e70a to your computer and use it in GitHub Desktop.
import UIKit
import AVKit
import MobileCoreServices
class ViewController: UIViewController {
let fillImage = UIImage(named: "fill")
let aspectImage = UIImage(named: "aspect")
@IBOutlet weak var videoView: UIView!
@IBOutlet weak var viewChangeButton: UIButton!
@IBAction func onViewChange(_ sender: Any) {
let isFill = self.viewState == .fill
self.viewState = isFill ? .aspect : .fill
viewChangeButton.setImage(!isFill ? fillImage : aspectImage, for: .normal)
self.videoLayer?.videoGravity = !isFill ? .resizeAspectFill : .resizeAspect
}
@IBAction func onAddVideo(_ sender: Any) {
self.pickVideo(sourceType: UIImagePickerController.SourceType.savedPhotosAlbum)
}
enum ViewState {
case fill
case aspect
}
var viewState:ViewState = .fill
let videoPicker = UIImagePickerController()
var videoUrl:URL?
var videoPlayer:AVPlayer?
var videoLayer:AVPlayerLayer?
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.playVideoFromStart), name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)
}
}
extension ViewController:UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
dismiss(animated: true, completion: nil)
}
@objc func playVideoFromStart() {
videoPlayer?.seek(to: .zero)
videoPlayer?.play()
}
func removeOlderVideoLayer() {
self.videoLayer?.removeFromSuperlayer()
}
func playVideo() {
videoPlayer = AVPlayer(url: videoUrl!)
guard let videoPlayer = self.videoPlayer else {
return
}
videoPlayer.actionAtItemEnd = .none
self.videoLayer = AVPlayerLayer(player: videoPlayer)
guard let videoLayer = self.videoLayer else {
return
}
videoLayer.frame = videoView.bounds
videoLayer.videoGravity = self.viewState == .fill ? .resizeAspectFill : .resizeAspect
self.videoView.layer.addSublayer(videoLayer)
playVideoFromStart()
}
func pickVideo(sourceType: UIImagePickerController.SourceType) {
guard UIImagePickerController.isSourceTypeAvailable(sourceType) else { return }
videoPicker.sourceType = sourceType
videoPicker.mediaTypes = [kUTTypeMovie as String]
videoPicker.allowsEditing = false
videoPicker.videoQuality = .typeHigh
if #available(iOS 11.0, *) {
videoPicker.videoExportPreset = AVAssetExportPresetPassthrough
}
videoPicker.delegate = self
self.present(videoPicker, animated: true, completion: {
self.removeOlderVideoLayer()
})
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let videoUrl = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
self.videoUrl = videoUrl
}
dismiss(animated: true) {
self.playVideo()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment