2016-07-25 8 views
1

AVPlayerが音楽の再生を開始するときにactivityIndi​​catorを停止しようとしていますが、もう一度AVPlayerを起動(ロード、バッファリング)するとactivityIndi​​catorを開始します。それは少し働いて、問題は、AVPlayerは音楽を再生する前に数秒(5,6,7)前にactivityIndi​​catorを停止することです。また、もう一度activityIndi​​catorを起動しないでください(ロード、バッファリング)。いずれにせよ、私の間違いはどこにあるのか、私はそれを修正する必要があるのか​​は分かりません。おかげAVPlayerは再生前にUIActivityIndi​​catorを停止します

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 

enter image description here

答えて

0

あなたのコードでは、セルが押されるたびにactivityView.stopAnimating()があります。どのようなものでも、アニメーションが開始されるかクリックに応じて停止するかによって異なります。if sender.selected == false

activityView.stopAnimating()を削除すると、あまり早くアニメーションが停止しません。あなたの質問とコードを読むのは難しいですが、出力がどこから来ているのかわかりません。第二の問題に関しては

+0

私が最初にplayボタンを押したとき、そのコードは 'audioControlButtonAction'ボタンの' if sender.selected == false {............} 'を実行しますか? – ZAFAR007

0

すなわち「そしてまた、それは再起動activityIndi​​catorとき、それは再び(読み込み、バッファリング)ではない」

私はそのための回避策は、次のいずれかの可能性がありだと思う: -

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

初めてのことではありませんactivityIndi​​catorは、音楽を再生するときにactivityIndi​​catorも停止しますが、次回インターネット接続が遅くなったり、startAnimatingを開始しないなどの理由で再度ロードする必要があります。 – ZAFAR007

+0

問題は 'AVPlayerStatus.ReadyToPlay'や' default: 'で' observeValueForKeyPath'にあると思うのですか? – ZAFAR007

+0

多分私は、ブレークポイントを追加し、問題がobserverValueForKeyPathか他の何かであるかどうかを確認するためにどのように実行されるかを見てください。また、低速接続のために接続可用性を確認するための到達可能性 – MShah

関連する問題