特定のビューを1回タップするとビデオを再生しようとしています。 .play()
関数は、関数内のif文(if
)内で直接呼び出すと正常に機能します(setupPlayerView()
関数内のURLを「チェック」します)。最初の関数(setupPlayerView
とdefInteractions
)は、ビデオプレーヤのプロパティとサブビュー/サブレイヤなどを設定するオーバーライドinitで呼び出されます。最後の機能は、2番目の機能によってトリガーされます。私はと呼ばれ、以下の機能を持つシングルタップを検出するために、FUNC#1 関数内の変数にアクセスする
func setupPlayerView() {
//insert url
let urlString = "https://blurtime.com/images/testvideo.mov"
//check URL if can be converted to NSURL
if let videoURL = NSURL(string: urlString){
//player's video
let player = AVPlayer(url: videoURL as URL)
//add sub-layer
let playerLayer = AVPlayerLayer(player: player)
self.layer.addSublayer(playerLayer)
playerLayer.frame = self.frame
//when are frames actually rendered (when is video loaded)
player.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
//if I call player.play() here the video plays directly
}
}
IとしてUITapGestureRecognizersを:
コード... player
の宣言と下の私のコメントに注意を払います(すぐ前の関数の後に)同様のinitオーバーライド:
コード:#2
今//set interactions
func defInteractions(){
//enable interaction
controlsContainerView.isUserInteractionEnabled = true
//singletap
let singleTap = UITapGestureRecognizer(target: self, action: #selector(singleTapDetected(_:)))
singleTap.numberOfTapsRequired = 1
//controlsContainerView
controlsContainerView.addGestureRecognizer(singleTap)
}
funcを、私はを呼び出すしたいと思います
コード:現在、このようになりますsingleTapDetected関数内他の人ではなく、私のように#3
func singleTapDetected(_ sender: UITapGestureRecognizer) {
player.play()
}
funcをしかし、それはこの関数として、もちろん動作しませんがオーバーライドINIT外にありますエラーuse of unresolved identifier 'player'
を取得します。 player.play()
に電話をかけて、最初の関数で呼び出した場合と同じ結果が得られますか? if内でアクセスできますか?
var player: AVPlayer?
次に、このようにそれを初期化します:
if self.player == nil {
player = AVPlayer(url: videoURL as URL)
}
その後、あなたは簡単にどこでもあなたのクラスでからそれにアクセスすることができ、私は
'player'をプロパティにします。 – rmaddy