119 lines
4.1 KiB
Swift
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)
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|