我正在使用自定义图像/视频选择器来选择时间流逝,一旦选择器视图被解除,我想在UIView中播放我已经在界面构建器中添加到视图控制器的时间间隔。我目前的代码如下,但问题是,当选择时间流逝时,它不会被播放。
查看视频播放器的插座和广告
@IBOutlet var videoView: UIView!
let ipc = QBImagePickerController()
var playerItem: AVPlayerItem?
var videoPlayer: AVPlayer?
var playerLayer: AVPlayerLayer?
完成了选择资产代码
func qb_imagePickerController(imagePickerController: QBImagePickerController, didFinishPickingAssets assets: [AnyObject]) {
for asset in assets as! [PHAsset] {
PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil, resultHandler: {(avAsset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) -> Void in
self.playerItem = AVPlayerItem(asset: avAsset!)
self.videoPlayer = AVPlayer(playerItem: self.playerItem!)
self.playerLayer = AVPlayerLayer(player: self.videoPlayer)
self.playerLayer!.frame = self.videoView.bounds
})
}
self.dismissViewControllerAnimated(true, completion: { self.play() })
}
播放()功能代码
func play(){
videoPlayer!.play()
}
答案 0 :(得分:2)
我真的不知道您正在使用的库,但它似乎有完成块。这些是在后台线程中运行的。
实际上存在一个问题:在分配变量(播放器,项目等)之前,你会关闭视图控制器。
假设您是Swift的新手,我将详细介绍您的代码在运行时的行为:
•当您的用户选择照片时,代理人会调用该功能
•视图控制器被关闭,播放器开始播放
•然后你的for循环运行并为玩家分配了一个项目(太晚了)
您想要实现的是分配要播放的项目然后关闭VC。由于UI代码只能在前台运行(主线程),因此您不能只在完成块中移动dismiss函数,但是您需要使用Grand Central Dispatch在主线程中运行一次for循环完成。< / p>
我建议你下载GitHub中的Async library,它是GCD的一个包装器(一旦下载浏览到Sources文件夹并在你的Xcode项目中拖动Async.swift文件)。
然后你会想要编辑&#34;完成选择资产&#34;为了播放你的视频而对此起作用:
func qb_imagePickerController(imagePickerController: QBImagePickerController, didFinishPickingAssets assets: [AnyObject]) {
let photoAssets = assets as! [PHAsset]
PHImageManager.defaultManager().requestAVAssetForVideo(photoAssets[0], options: nil, resultHandler: {(avAsset: AVAsset?, audioMix: AVAudioMix?, info: [NSObject : AnyObject]?) -> Void in
self.playerItem = AVPlayerItem(asset: avAsset!)
self.videoPlayer = AVPlayer(playerItem: self.playerItem!)
self.playerLayer = AVPlayerLayer(player: self.videoPlayer)
self.playerLayer!.frame = self.videoView.bounds
Async.main { self.dismissViewControllerAnimated(true, completion: { self.play() }) }
})
}
BTW我删除了for-loop coz我发现你只是愿意选择阵列中的第一个资产。 (如果错误告诉我!)
去尝试一下并告诉我它是否有效
(更多关于GCD here!)