AVPlayer在播放前停止UIActivityIndicator
我试图在AVPlayer开始播放音乐时停止activityIndicator,并且在AVPlayer再次启动时(加载,缓冲)启动activityIndicator。这一点起作用,问题在于播放音乐之前,AVPlayer在几秒钟之前停止activityIndicator(5,6,7)。当它再次(加载,缓冲)时,它不会再次启动activityIndicator。任何人都知道我的错误在哪里,或者我需要修复它。由于AVPlayer在播放前停止UIActivityIndicator
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开始后(5,6,7秒)玩这一行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
那么在你的代码中,无论何时按下一个单元格,你都有activityView.stopAnimating()
。所以无论如何,要么动画将开始或停止点击,这取决于if sender.selected == false
所以我认为如果你删除activityView.stopAnimating()
那么它不会停止这么早的动画。阅读你的问题和代码是很难的,因为我不确定输出是从哪里来的。
关于第二个问题,即“并且还没有再次启动activityIndicator当它再次(加载,缓冲)”
我觉得应该是一个解决办法可能是下列之一: -
一)
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()
}
}
不,我的意思是第一次显示activityIndicator也会在播放音乐时停止activityIndicator,但当下一次需要缓存或再次加载时,由于互联网连接速度缓慢或由于其他原因而无法启动“startAnimating”。 – ZAFAR007
我认为问题出现在'observeValueForKeyPath'中,因为它总是进入'AVPlayerStatus.ReadyToPlay'或'default:'? – ZAFAR007
也许我不太确定,添加断点并查看执行情况如何确认问题是否出现在observerValueForKeyPath或其他位置。另外,如果由于连接速度较慢,还包括可用性检查连接可用性 – MShah
第一次当我按播放按钮只是该代码执行'如果sender.selected == false {............}''audioControlButtonAction'按钮? – ZAFAR007