Created
October 10, 2018 01:13
-
-
Save chetanankola/a9009f25f80f4384f2f11822d1f5e70a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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