Explorar o código

tried play videos with AVVideoController

nayooti %!s(int64=4) %!d(string=hai) anos
pai
achega
0da7abaef1
Modificáronse 1 ficheiros con 76 adicións e 5 borrados
  1. 76 5
      deltachat-ios/Controller/GalleryViewController.swift

+ 76 - 5
deltachat-ios/Controller/GalleryViewController.swift

@@ -1,6 +1,7 @@
 import UIKit
 import DcCore
 import AVFoundation
+import AVKit
 
 class GalleryViewController: UIViewController {
 
@@ -216,7 +217,10 @@ extension GalleryViewController: UICollectionViewDataSource, UICollectionViewDel
         return UIContextMenuConfiguration(
             identifier: nil,
             previewProvider: {
-                return XLPreviewViewController(item: item)
+
+                return VideoPreviewController(item: item)
+
+               // return XLPreviewViewController(item: item)
             },
             actionProvider: { [weak self] _ in
                 return self?.makeContextMenu(indexPath: indexPath)
@@ -289,6 +293,60 @@ extension GalleryViewController {
         let previewController = PreviewController(type: .multi(mediaMessageIds, index))
         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 {
@@ -355,11 +413,24 @@ private class XLPreviewViewController: UIViewController {
         let player = AVPlayer(url: videoUrl)
         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.videoGravity = .resizeAspectFill
+        playerLayer.videoGravity = .resizeAspect
+        print(view.bounds.size)
+        print(size)
+        print(thumbnail.size)
 
         let playerView = UIView()
         playerView.layer.addSublayer(playerLayer)