电容器自定义 AVPlayer 视图控制器
Capacitor Custom AVPlayer View Controller
我是 Swift / iOS 的新手,所以如果我觉得我很愚蠢,我深表歉意。我正在尝试在启动时为我的电容器 iOS 应用程序播放自定义视频闪屏,但我似乎无法使用 segues 切换视图控制器。在我的主故事板上,我有两个视图控制器,Capacitor Bridge View(它运行我的反应应用程序非常好),我有一个 AVPlayer 视图控制器。
我已将我的 AVPlayer 设置为初始视图控制器,并使用 ID 为“test”的 segue 创建了到电容器桥视图的 segue,并且我在自定义 AVPlayer 控制器中调用了 performsegue() 方法尽管视频 运行.
但它什么也没做
这是我的 AVPlayer
的自定义 class
//
// 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 ")
}
}
视频播放后,模拟器记录“视频播放完毕”,但未推送 Bridge View Controller。
我通过避免使用单独的视图控制器解决了这个问题,对于任何使用 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.
}
*/
}
我是 Swift / iOS 的新手,所以如果我觉得我很愚蠢,我深表歉意。我正在尝试在启动时为我的电容器 iOS 应用程序播放自定义视频闪屏,但我似乎无法使用 segues 切换视图控制器。在我的主故事板上,我有两个视图控制器,Capacitor Bridge View(它运行我的反应应用程序非常好),我有一个 AVPlayer 视图控制器。
我已将我的 AVPlayer 设置为初始视图控制器,并使用 ID 为“test”的 segue 创建了到电容器桥视图的 segue,并且我在自定义 AVPlayer 控制器中调用了 performsegue() 方法尽管视频 运行.
但它什么也没做这是我的 AVPlayer
的自定义 class//
// 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 ")
}
}
视频播放后,模拟器记录“视频播放完毕”,但未推送 Bridge View Controller。
我通过避免使用单独的视图控制器解决了这个问题,对于任何使用 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.
}
*/
}