Ios Swift 4&;代码10。在应用程序启动时播放视频,完成后显示view controller
首先,我对Xcode 10和Swift 4完全陌生,我在这里搜索过,但还没有找到有效的代码 我想要的是: 在启动应用程序时播放本地存储的视频(称为“launchvideo”)。 视频完成后,显示/移动到脚本ID为“菜单”的UIviewcontroller 到目前为止,我有我的主导航控制器和它的链接视图控制器。 我想我需要一个UIview来保存要在此页面上播放的视频 有没有人可以帮助一个新人?Ios Swift 4&;代码10。在应用程序启动时播放视频,完成后显示view controller,ios,swift4,xcode10,Ios,Swift4,Xcode10,首先,我对Xcode 10和Swift 4完全陌生,我在这里搜索过,但还没有找到有效的代码 我想要的是: 在启动应用程序时播放本地存储的视频(称为“launchvideo”)。 视频完成后,显示/移动到脚本ID为“菜单”的UIviewcontroller 到目前为止,我有我的主导航控制器和它的链接视图控制器。 我想我需要一个UIview来保存要在此页面上播放的视频 有没有人可以帮助一个新人? 谢谢您必须在launchvideoVC上加载一个视频,如swift 4及更高版本中的以下方式 impo
谢谢您必须在launchvideoVC上加载一个视频,如swift 4及更高版本中的以下方式
import AVFoundation
import AVKit
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
initVideo()
}
func initVideo(){
do {
try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
} catch {
print(error)
}
let path = Bundle.main.path(forResource: "yourlocalvideo", ofType:"mp4");
player = AVPlayer(url: NSURL(fileURLWithPath: path!) as URL)
NotificationCenter.default.addObserver(self, selector: #selector(launchvideoVC.itemDidFinishPlaying(_:)), name: .AVPlayerItemDidPlayToEndTime, object: player?.currentItem)
DispatchQueue.main.async(execute: {() -> Void in
let playerLayer = AVPlayerLayer(player: self.player)
playerLayer.frame = self.view.bounds
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
playerLayer.zPosition = 1
self.view.layer.addSublayer(playerLayer)
self.player?.seek(to: CMTime.zero)
self.player?.play()
})
}
@objc func itemDidFinishPlaying(_ notification: Notification?) {
//move to whatever UIViewcontroller with a storyboard ID of "menu"
}
我想这可能对你有帮助。
快乐编码:)首先将启动屏幕情节提要从“常规”选项卡中的“项目设置”更改为“主情节提要” 创建一个具有以下名称的视图控制器,并编写代码以实现AVPlayer来播放视频
import UIKit
import AVFoundation
class VideoLaunchVC: UIViewController {
func setupAVPlayer() {
let videoURL = Bundle.main.url(forResource: "Video", withExtension: "mov") // Get video url
let avAssets = AVAsset(url: videoURL!) // Create assets to get duration of video.
let avPlayer = AVPlayer(url: videoURL!) // Create avPlayer instance
let avPlayerLayer = AVPlayerLayer(player: avPlayer) // Create avPlayerLayer instance
avPlayerLayer.frame = self.view.bounds // Set bounds of avPlayerLayer
self.view.layer.addSublayer(avPlayerLayer) // Add avPlayerLayer to view's layer.
avPlayer.play() // Play video
// Add observer for every second to check video completed or not,
// If video play is completed then redirect to desire view controller.
avPlayer.addPeriodicTimeObserver(forInterval: CMTime(seconds: 1, preferredTimescale: 1) , queue: .main) { [weak self] time in
if time == avAssets.duration {
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ViewController") as! ViewController
self?.navigationController?.pushViewController(vc, animated: true)
}
}
}
//------------------------------------------------------------------------------
override func viewDidLoad() {
super.viewDidLoad()
}
//------------------------------------------------------------------------------
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.setupAVPlayer() // Call method to setup AVPlayer & AVPlayerLayer to play video
}
}
Main.Storyboard:
项目启动屏幕文件:
另请参见以下视频:
首先,使用view创建一个新的视图控制器,并将启动屏幕情节提要从“常规”选项卡中的“项目设置”更改为“主情节提要” 并将您的视频添加到文件夹中 然后只需将我的以下代码添加到您的launch screenView控制器:
import UIKit
import MediaPlayer
import AVKit
class LaunchViewController: UIViewController {
fileprivate var rootViewController: UIViewController? = nil
var player: AVPlayer?
var playerController = AVPlayerViewController()
override func viewDidLoad() {
super.viewDidLoad()
showSplashViewController()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func playVideo() {
let videoURL = NSURL(string: "videoplayback")
player = AVPlayer(url: videoURL! as URL)
let playerController = AVPlayerViewController()
playerController.player = player
self.addChildViewController(playerController)
// Add your view Frame
playerController.view.frame = self.view.frame
// Add subview in your view
self.view.addSubview(playerController.view)
player?.play()
}
private func loadVideo() {
//this line is important to prevent background music stop
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
} catch { }
let path = Bundle.main.path(forResource: "videoplayback", ofType:"mp4")
let filePathURL = NSURL.fileURL(withPath: path!)
let player = AVPlayer(url: filePathURL)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.frame
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
playerLayer.zPosition = -1
self.view.layer.addSublayer(playerLayer)
player.seek(to: kCMTimeZero)
player.play()
}
func showSplashViewControllerNoPing() {
if rootViewController is LaunchViewController {
return
}
loadVideo()
}
/// Simulates an API handshake success and transitions to MapViewController
func showSplashViewController() {
showSplashViewControllerNoPing()
delay(6.00) {
self.showMenuNavigationViewController()
}
}
public func delay(_ delay:Double, closure:@escaping ()->()) {
DispatchQueue.main.asyncAfter(
deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
}
/// Displays the MapViewController
func showMenuNavigationViewController() {
guard !(rootViewController is Home) else { return }
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let nav = storyboard.instantiateViewController(withIdentifier: "homeTab") as! Home
nav.willMove(toParentViewController: self)
addChildViewController(nav)
if let rootViewController = self.rootViewController {
self.rootViewController = nav
rootViewController.willMove(toParentViewController: nil)
transition(from: rootViewController, to: nav, duration: 0.55, options: [.transitionCrossDissolve, .curveEaseOut], animations: { () -> Void in
}, completion: { _ in
nav.didMove(toParentViewController: self)
rootViewController.removeFromParentViewController()
rootViewController.didMove(toParentViewController: nil)
})
} else {
rootViewController = nav
view.addSubview(nav.view)
nav.didMove(toParentViewController: self)
}
}
override var prefersStatusBarHidden : Bool {
switch rootViewController {
case is LaunchViewController:
return true
case is Home:
return false
default:
return false
}
}
}
如果你的意思是启动屏幕,那么你不能把视频放在那里。是吗?如果您想在启动屏幕结束后立即播放视频,然后尝试搜索
AVPlayerLayer
,这样就可以播放不在启动屏幕上的视频了。我知道你不能在那里放视频。在应用程序加载之前,这将有一个静态图像。@Astro,正如Tj3n所建议的,在加载所有UI元素后,您需要在UIViewController中播放launchVideo,可能是在ViewDidAspect委托方法中。请看一看,我一定还是做错了什么。我在这一行中得到了一个构建错误:“let vc=UIStoryboard(name:“Main”,bundle:nil)。。。我给它起的名字不对吗?这只是你问题的解决办法。您必须使用视图控制器和标识符,这些控制器和标识符用于相同的目的。向我展示你的带有标识符和视图控制器的情节提要。我已经在下面发布了情节提要,你可以打包你的文件并提供给我使用吗?这将帮助我再次学习tooHi@sagar,你能进一步帮助我吗?我尝试了这段代码,但它有超过13个错误,无法构建。不知道为什么