AVPlayer在播放之前停止UIActivityIndicator [英] AVPlayer stop UIActivityIndicator before playing
问题描述
我试图在AVPlayer开始播放音乐时停止activityIndicator,并在AVPlayer再次启动(加载,缓冲)时也启动activityIndicator.有点奏效,问题是AVPlayer在播放音乐之前几秒钟(5,6,7)之前停止了activityIndicator.而且,当它再次(加载,缓冲)时,它不会再次启动activityIndicator.任何人都不知道我的错误在哪里或我需要解决什么.谢谢
I'm trying to stop activityIndicator when AVPlayer start playing music, and also start activityIndicator when again AVPlayer start (loading, buffering). It little bit works, the problem is that AVPlayer stop activityIndicator before some seconds (5,6,7) before playing music. And also it not start again activityIndicator when it again (loading, buffering). Any one have any idea where is my mistake or what i need to fix it. Thanks
var activityView = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge)
var selectIndex:Int = -1
var check = true
var url : String!
var playerItem:AVPlayerItem?
var player:AVPlayer?
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! RadioCollectionViewCell
cell.backgroundColor = UIColor.yellowColor()
let object = objects[indexPath.row]
cell.img.image = UIImage(named: object["image"]!)
cell.btnPlay.addTarget(self, action: Selector("audioControlButtonAction:"), forControlEvents: UIControlEvents.TouchUpInside)
cell.btnPlay.tag = indexPath.row+1
return cell
}
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){
print("You selected cell #\(indexPath.item)!")
}
func audioControlButtonAction(sender: UIButton){
if check == false {
deallocObservers(player!)
}
var btn:NSInteger
btn = sender.tag as NSInteger
let object = objects[btn-1]
let nurl = NSURL(string: "\(object["url"]!)")!
playerItem = AVPlayerItem(URL: nurl)
player=AVPlayer(playerItem: playerItem!)
print(selectIndex)
if selectIndex != -1 && selectIndex != sender.tag
{
let bt:UIButton = self.view.viewWithTag(selectIndex) as! UIButton
if bt.selected == true
{
bt.selected = false
}
}
if sender.selected == false{
player!.addObserver(self, forKeyPath: "status", options:NSKeyValueObservingOptions(), context: nil)
player!.addObserver(self, forKeyPath: "playbackBufferEmpty", options:NSKeyValueObservingOptions(), context: nil)
player!.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options:NSKeyValueObservingOptions(), context: nil)
player!.addObserver(self, forKeyPath: "playbackBufferFull", options:NSKeyValueObservingOptions(), context: nil)
player!.addObserver(self, forKeyPath: "loadedTimeRanges", options: NSKeyValueObservingOptions(), context: nil)
player!.play()
sender.selected = true
check = false
selectIndex = sender.tag
activityView.startAnimating()
}
else{
activityView.stopAnimating()
check = true
player?.pause()
sender.selected = false
selectIndex = -1
}
print(selectIndex)
}
func deallocObservers(player: AVPlayer) {
player.removeObserver(self, forKeyPath: "status")
player.removeObserver(self, forKeyPath: "playbackBufferEmpty")
player.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp")
player.removeObserver(self, forKeyPath: "loadedTimeRanges")
player.removeObserver(self, forKeyPath: "playbackBufferFull")
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>){
if object?.isEqual(player) == true && keyPath == "status" {
print(player?.status)
switch player!.status {
case AVPlayerStatus.Failed:
print("Player item status failed")
player?.play()
break
case AVPlayerStatus.ReadyToPlay:
print("Player item status is ready to play")
activityView.stopAnimating()
break
case AVPlayerStatus.Unknown:
print("player item status is unknown")
break
}
switch keyPath! {
case "playbackBufferFull":
activityView.stopAnimating()
print("playbackBufferFull")
break
case "playbackLikelyToKeepUp":
activityView.stopAnimating()
print("playbackLikelyToKeepUp")
break
case "playbackBufferEmpty":
activityView.startAnimating()
print("playbackBufferEmpty")
break
case "loadedTimeRanges":
print("loadedTimeRanges")
default:
print("Error")
break
}
}
}
}
输出
AVPlayer在此行Player item status is ready to play
AVPlayer start playing after(5,6,7 seconds) this line Player item status is ready to play
-1
1
Optional(__C.AVPlayerStatus)
Player item status is ready to play
Error
1
-1
-1
1
Optional(__C.AVPlayerStatus)
Player item status is ready to play
Error
推荐答案
关于第二个问题,即而且当它再次(加载,缓冲)时,它也不会再次启动activityIndicator"
Regarding second problem i.e. "And also it not start again activityIndicator when it again (loading, buffering)"
我认为解决此问题的方法可能是以下之一:-
I think a workaround for that could be one of following:-
a)
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){
print("You selected cell #\(indexPath.item)!")
//Start activityView Animation when user clicks on any item which won't be buffered by default
activityView.startAnimating()
}
或
b)
var selectIndex:Int = -1 {
didSet {
//Start activityView Animation when user clicks on any item which won't be buffered by default
activityView.startAnimating()
}
}
这篇关于AVPlayer在播放之前停止UIActivityIndicator的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!