1

ビデオが終了したときにフェードアウトしたいAVPlayerViewControllerを使用しています...ビデオの終わりのイベントをキャプチャできます.AVPlayer用にまとめられたコードは機能しますが、AVPlayerViewControllerは機能しません。

self.playerItem = AVPlayerItem(URL: videoURL)
self.player = AVPlayer(playerItem: self.playerItem)
self.playerLayer = AVPlayerLayer(player: self.player)
self.streamPlayer =  AVPlayerViewController()
self.streamPlayer.player = self.player
self.streamPlayer.view.frame = CGRect(x: 128, y: 222, width: 512, height: 256)

このコードも機能しますが、全画面表示になります。全画面表示はしたくありません...

//self.presentViewController(self.streamPlayer, animated: true) {
//   self.streamPlayer.player!.play()
//}

私はこれを使用しますか?

self.view.addSubview(self.streamPlayer.view)
self.streamPlayer.player!.play()

イベントキャプチャ..

override func viewWillAppear(animated: Bool) {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "finishedPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem)
}

イベントコード ...

func finishedPlaying(myNotification:NSNotification) {

    let fadeOut = CABasicAnimation(keyPath: "opacity")
    fadeOut.fromValue = 1.0
    fadeOut.toValue = 0.0
    fadeOut.duration = 8.0
    fadeOut.delegate = self
    fadeOut.setValue("video", forKey:"fadeOut")
    fadeOut.removedOnCompletion = false
    fadeOut.fillMode = kCAFillModeForwards

この行はAVPlayerViewControllerでは何もしません/AVPlayerではうまくフェードアウトしますか?

    playerLayer.addAnimation(fadeOut, forKey: nil)

これは、AVPlayerViewController を削除するだけで、これを機能させることができない場合はプラン B です。

    //self.streamPlayer.view.removeFromSuperview()
    print("VIDEO finished")
}
4

1 に答える 1

1

AVPlayerViewController には独自の AVPlayerLayer があり、作成した AVPlayerLayer については知りません。したがって、行 playerLayer.addAnimation(fadeOut, forKey: nil) は効果がありません。AVPlayerViewController のビューのアルファ値を設定またはアニメーション化する必要があります。フェード アニメーションについては、 +[UIView animateWithDuration:(...)] メソッドを見て、完了ハンドラで self.streamPlayer.view.removeFromSuperview() を呼び出すことができます。

于 2016-06-10T16:28:03.037 に答える