Tusker/Tusker/Screens/Compose/Asset Picker/AssetPreviewViewController....

119 lines
4.1 KiB
Swift

//
// AssetPreviewViewController.swift
// Tusker
//
// Created by Shadowfacts on 1/4/20.
// Copyright © 2020 Shadowfacts. All rights reserved.
//
import UIKit
import Photos
import PhotosUI
import AVKit
class AssetPreviewViewController: UIViewController {
let asset: PHAsset
init(asset: PHAsset) {
self.asset = asset
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .black
if asset.mediaType == .image {
if asset.mediaSubtypes.contains(.photoLive) {
showLivePhoto()
} else {
showImage()
}
} else if asset.mediaType == .video {
playVideo()
} else {
fatalError("asset mediaType must be image or video")
}
}
func showImage() {
let imageView = UIImageView()
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.contentMode = .scaleAspectFit
view.addSubview(imageView)
NSLayoutConstraint.activate([
imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
imageView.topAnchor.constraint(equalTo: view.topAnchor),
imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
])
let options = PHImageRequestOptions()
options.version = .current
options.deliveryMode = .opportunistic
options.resizeMode = .none
options.isNetworkAccessAllowed = true
PHImageManager.default().requestImage(for: asset, targetSize: view.bounds.size, contentMode: .aspectFit, options: options) { (image, _) in
DispatchQueue.main.async {
imageView.image = image
}
}
}
func showLivePhoto() {
let options = PHLivePhotoRequestOptions()
options.deliveryMode = .opportunistic
options.version = .current
options.isNetworkAccessAllowed = true
PHImageManager.default().requestLivePhoto(for: asset, targetSize: view.bounds.size, contentMode: .aspectFit, options: options) { (livePhoto, _) in
guard let livePhoto = livePhoto else {
fatalError("failed to get live photo")
}
DispatchQueue.main.async {
let livePhotoView = PHLivePhotoView()
livePhotoView.livePhoto = livePhoto
livePhotoView.isMuted = true
livePhotoView.startPlayback(with: .full)
livePhotoView.translatesAutoresizingMaskIntoConstraints = false
livePhotoView.contentMode = .scaleAspectFit
self.view.addSubview(livePhotoView)
NSLayoutConstraint.activate([
livePhotoView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
livePhotoView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
livePhotoView.topAnchor.constraint(equalTo: self.view.topAnchor),
livePhotoView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor)
])
}
}
}
func playVideo() {
let options = PHVideoRequestOptions()
options.deliveryMode = .automatic
options.isNetworkAccessAllowed = true
options.version = .current
PHImageManager.default().requestAVAsset(forVideo: asset, options: options) { (avAsset, _, _) in
guard let avAsset = avAsset else {
fatalError("failed to get AVAsset")
}
DispatchQueue.main.async {
let playerController = AVPlayerViewController()
let item = AVPlayerItem(asset: avAsset)
let player = AVPlayer(playerItem: item)
player.isMuted = true
player.play()
playerController.player = player
self.embedChild(playerController)
}
}
}
}