【问题标题】:Capacitor Custom AVPlayer View Controller电容自定义 AVPlayer 视图控制器
【发布时间】:2021-12-31 08:05:11
【问题描述】:

我是 Swift / iOS 的新手,所以如果我觉得我很愚蠢,我深表歉意。我正在尝试在启动时为我的电容器 iOS 应用程序播放自定义视频闪屏,但我似乎在使用 segues 切换视图控制器时遇到了麻烦。在我的 Main storyboard 上,我有两个 View Controller,一个 Capacitor Bridge View(它可以很好地运行我的 react 应用程序),还有一个 AVPlayer View Controller。

我已将我的 AVPlayer 设置为初始视图控制器,并创建了一个到电容器桥视图的 segue,该 segue 的 id 为“test”,我在视频末尾的自定义 AVPlayer 控制器中调用了 performegue() 方法,尽管它正在运行,但它什么也没做。

这是我的 AVPlayer 的自定义类

//
//  AVPlayer.swift
//  App
//
//

import Foundation
import UIKit
import AVFoundation
import AVKit
import Capacitor


class viewControl: AVPlayerViewController {
    
    override func viewDidAppear(_ animated: Bool) {
            playVideo()
        }
        
        let playerController = AVPlayerViewController()
        private func playVideo() {
            guard let path = Bundle.main.path(forResource: "Splash_Screen_Christmas", ofType:"mp4") else {
                debugPrint("splash.m4v not found")
                return
            }
            let player = AVPlayer(url: URL(fileURLWithPath: path))
            playerController.showsPlaybackControls = false
            playerController.player = player
            playerController.videoGravity = .resizeAspectFill
            NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: playerController.player?.currentItem)
            present(playerController, animated: true) {
                player.play()
            }
        }
        @objc func playerDidFinishPlaying(note: NSNotification) {
           // let storyboard = UIStoryboard(name: "Main", bundle: nil)
            // let vc = storyboard.instantiateViewController(withIdentifier: "MainVC")
            performSegue(withIdentifier: "test", sender: self)
            print("Method, video is finished ")
        }
    
    
}

视频播放后,模拟器记录“视频完成”,但桥视图控制器没有被推送。

【问题讨论】:

    标签: ios swift capacitor


    【解决方案1】:

    我通过避免使用单独的视图控制器解决了这个问题,对于任何使用 Capacitor 添加新视图控制器的人,您需要通过创建 CAPBridgeViewController 的子类来切换视图控制器

    import UIKit
    import Capacitor
    import AVKit
    // Instantiate a subclass of CAPBridgeViewController
    
    class capController: CAPBridgeViewController {
        // Define video URL here
        let player: AVPlayer = AVPlayer(url: URL(fileURLWithPath: Bundle.main.path(forResource: "Splash_Screen_Normal", ofType:"mp4")!))
        
          var playerLayer: AVPlayerLayer!
    
          override func viewWillAppear(_ animated: Bool) {
              super.viewWillAppear(animated)
    
              playerLayer = AVPlayerLayer(player: player)
              playerLayer.videoGravity = .resizeAspectFill
              playerLayer.frame = self.view.bounds
              view.layer.addSublayer(playerLayer)
              // Try catch to avoid breaking user background audio.
              do {
                  try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: .mixWithOthers)
                      try AVAudioSession.sharedInstance().setActive(true)
                 } catch {
                      print(error)
                 }
              // End of background audio code validation
              player.play()
              NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)
          }
    
          @objc func playerDidFinishPlaying(note: NSNotification) {
              print("Video has finished running.")
              playerLayer.removeFromSuperlayer()
          }
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        }
        
    
        /*
        // MARK: - Navigation
    
        // In a storyboard-based application, you will often want to do a little preparation before navigation
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            // Get the new view controller using segue.destination.
            // Pass the selected object to the new view controller.
        }
        */
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 2013-02-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2012-04-19
      • 2016-09-27
      • 1970-01-01
      相关资源
      最近更新 更多