|
@@ -1,6 +1,7 @@
|
|
import UIKit
|
|
import UIKit
|
|
import DcCore
|
|
import DcCore
|
|
import AVFoundation
|
|
import AVFoundation
|
|
|
|
+import AVKit
|
|
|
|
|
|
class GalleryViewController: UIViewController {
|
|
class GalleryViewController: UIViewController {
|
|
|
|
|
|
@@ -216,7 +217,10 @@ extension GalleryViewController: UICollectionViewDataSource, UICollectionViewDel
|
|
return UIContextMenuConfiguration(
|
|
return UIContextMenuConfiguration(
|
|
identifier: nil,
|
|
identifier: nil,
|
|
previewProvider: {
|
|
previewProvider: {
|
|
- return XLPreviewViewController(item: item)
|
|
|
|
|
|
+
|
|
|
|
+ return VideoPreviewController(item: item)
|
|
|
|
+
|
|
|
|
+ // return XLPreviewViewController(item: item)
|
|
},
|
|
},
|
|
actionProvider: { [weak self] _ in
|
|
actionProvider: { [weak self] _ in
|
|
return self?.makeContextMenu(indexPath: indexPath)
|
|
return self?.makeContextMenu(indexPath: indexPath)
|
|
@@ -289,6 +293,60 @@ extension GalleryViewController {
|
|
let previewController = PreviewController(type: .multi(mediaMessageIds, index))
|
|
let previewController = PreviewController(type: .multi(mediaMessageIds, index))
|
|
present(previewController, animated: true, completion: nil)
|
|
present(previewController, animated: true, completion: nil)
|
|
}
|
|
}
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+private class VideoPreviewController: UIViewController {
|
|
|
|
+
|
|
|
|
+ var playerController = AVPlayerViewController()
|
|
|
|
+ let item: GalleryItem
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ init(item: GalleryItem) {
|
|
|
|
+ self.item = item
|
|
|
|
+ super.init(nibName: nil, bundle: nil)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ required init?(coder: NSCoder) {
|
|
|
|
+ fatalError("init(coder:) has not been implemented")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // MARK: - lifecycle
|
|
|
|
+ override func viewDidLoad() {
|
|
|
|
+ super.viewDidLoad()
|
|
|
|
+ addChild(playerController)
|
|
|
|
+ view.addSubview(playerController.view)
|
|
|
|
+ playerController.didMove(toParent: self)
|
|
|
|
+ playerController.view.frame = self.view.frame
|
|
|
|
+ playerController.view.backgroundColor = .darkGray
|
|
|
|
+ playerController.view.clipsToBounds = true
|
|
|
|
+ let url = item.msg.fileURL!
|
|
|
|
+ let player = AVPlayer(url: url)
|
|
|
|
+ player.play()
|
|
|
|
+ playerController.player = player
|
|
|
|
+
|
|
|
|
+ if let videoSize = item.thumbnailImage?.size {
|
|
|
|
+ print(videoSize)
|
|
|
|
+ // truncate edges on top/bottom or sides
|
|
|
|
+ let videoAspectRatio = videoSize.width / videoSize.height
|
|
|
|
+ let resizedHeightFactor = view.frame.height / videoSize.height
|
|
|
|
+ let resizedWidthFactor = view.frame.width / videoSize.width
|
|
|
|
+
|
|
|
|
+ let minFactor = min(resizedWidthFactor, resizedHeightFactor)
|
|
|
|
+ let maxHeight = videoSize.height * minFactor
|
|
|
|
+ let maxWidth = videoSize.width * minFactor
|
|
|
|
+
|
|
|
|
+ let size = CGSize(width: maxWidth, height: maxHeight)
|
|
|
|
+ preferredContentSize = size
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // preferredContentSize = // CGSize(width: view.frame.width, height: view.frame.height)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
private class XLPreviewViewController: UIViewController {
|
|
private class XLPreviewViewController: UIViewController {
|
|
@@ -355,11 +413,24 @@ private class XLPreviewViewController: UIViewController {
|
|
let player = AVPlayer(url: videoUrl)
|
|
let player = AVPlayer(url: videoUrl)
|
|
let playerLayer = AVPlayerLayer(player: player)
|
|
let playerLayer = AVPlayerLayer(player: player)
|
|
|
|
|
|
- let width = view.bounds.width
|
|
|
|
- let height = thumbnail.size.height * (width / thumbnail.size.width)
|
|
|
|
- let size = CGSize(width: width, height: height)
|
|
|
|
|
|
+
|
|
|
|
+ let maxWidth = min(view.bounds.width, thumbnail.size.width)
|
|
|
|
+ let maxHeight = min(view.bounds.height, thumbnail.size.height)
|
|
|
|
+ let size: CGSize
|
|
|
|
+ if view.bounds.height > view.bounds.width {
|
|
|
|
+ // portrait
|
|
|
|
+ let height = thumbnail.size.height * (maxWidth / thumbnail.size.width)
|
|
|
|
+ size = CGSize(width: maxWidth, height: height)
|
|
|
|
+ } else {
|
|
|
|
+ // landscape
|
|
|
|
+ let width = thumbnail.size.width * (maxHeight / thumbnail.size.height)
|
|
|
|
+ size = CGSize(width: width, height: maxHeight)
|
|
|
|
+ }
|
|
playerLayer.frame = CGRect(origin: .zero, size: size)
|
|
playerLayer.frame = CGRect(origin: .zero, size: size)
|
|
- playerLayer.videoGravity = .resizeAspectFill
|
|
|
|
|
|
+ playerLayer.videoGravity = .resizeAspect
|
|
|
|
+ print(view.bounds.size)
|
|
|
|
+ print(size)
|
|
|
|
+ print(thumbnail.size)
|
|
|
|
|
|
let playerView = UIView()
|
|
let playerView = UIView()
|
|
playerView.layer.addSublayer(playerLayer)
|
|
playerView.layer.addSublayer(playerLayer)
|