AVPlayer stop UIActivityIndicator before playing

匿名 (未验证) 提交于 2019-12-03 02:34:02

问题:

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         }     } } 

}

Output

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 

回答1:

Well in your code, whenever a cell is pressed you have activityView.stopAnimating(). so no matter what, either the animation will start OR stop on click, depending if sender.selected == false

So I think if you remove activityView.stopAnimating() then it will not stop animating so early. It's kind of hard to read your question and code as I am not sure exactly where the output is coming from.



回答2:

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() } 

or

b)

var selectIndex:Int = -1 { didSet {       //Start activityView Animation when user clicks on any item which won't be buffered by default       activityView.startAnimating()        } } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!