現在作成しているアプリが、UiTableViewのcellをタップして動画再生するものなのですが、現状では動画を再生するViewを生成して閉じられない状態です。
そこでUITapGestureRecognizerを用いてタップされたら動画を閉じる動作を実装しようとしたところうまくいかない状況です。
Selectorの扱いがよくわかっていないので検索して出てきたものを参考に作ってみた次第です。
swift
1class HomeViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UIScrollViewDelegate,UIGestureRecognizerDelegate{ 2 ... 3 4 override func viewDidLoad() { 5 ... 6 } 7 8 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 9 print("didSelectRowAt:(indexPath)") 10 selectedMediaUrl = HomeItems[indexPath.row]["file_url"].stringValue 11 12 moviePlayer(url: selectedMediaUrl) 13 tableView.deselectRow(at: indexPath, animated: true) 14 15 } 16 17 18 19 20 func tapGesture(gestureRecognizer:UITapGestureRecognizer){ 21 view.isHidden = true 22 } 23 var selector = Selector("tapGesture:") 24 var tapGestureRecognizer = UITapGestureRecognizer(target: self, action: selector) 25 26 27 28 func moviePlayer(url:String){ 29 let player = AVPlayer(url: URL(string: url)!) 30 31 let screenView = UIView() 32 screenView.frame = self.view.bounds 33 screenView.backgroundColor = UIColor(displayP3Red: 0, green: 0, blue: 0, alpha: 0) 34 screenView.addGestureRecognizer(tapGestureRecognizer) 35 36 let playerLayer = AVPlayerLayer(player: player) 37 playerLayer.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 38 39 self.view.layer.addSublayer(playerLayer) 40 self.view.addSubview(screenView) 41 player.play() 42 43 44} 45 46} 47
cellタップ部分のコードは上のようになっていて、動画のレイヤー上にレイヤーを1枚乗せてそれ(screenView)がタップ反応を取れば良いのかと思って書いていますが、コード中盤のfunc(tapGesture)などの書くべき位置がわかりません。
現状でている警告などは
- No method declared with Objective-C selector 'tapGesture:'
- Cannot use instance member 'selector' within property initializer; property initializers run before 'self' is available
です。どう書くべきでしょうか…
追記
moviePlayerを
swift
1 func moviePlayer(url:String){ 2 3 // 生成 4 let player = AVPlayer(url: URL(string: url)!) 5 6 // レイヤーの追加 7 let screenView = UIView() 8 screenView.frame = self.view.bounds 9 screenView.backgroundColor = UIColor(displayP3Red: 0, green: 0, blue: 0, alpha: 0) 10 11 let playerLayer = AVPlayerLayer(player: player) 12 playerLayer.frame = self.view.bounds 13 playerLayer.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5).cgColor 14 15 16 let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer( 17 target: self, 18 action: #selector(self.tapped(_:))) 19 tapGesture.delegate = self 20 21 screenView.addGestureRecognizer(tapGesture) 22 self.view.layer.addSublayer(playerLayer) 23 self.view.addSubview(screenView) 24 player.play() 25 if isTapped == true{ 26 screenView.isHidden = true 27 print(isTapped) 28 isTapped = false 29 } 30 31 } 32
に変更し
swift
1@objc func tapped(_ sender:UITapGestureRecognizer){ 2 if sender.state == .ended{ 3 isTapped = true 4 print(isTapped) 5 } 6 7 }
と、isTappedという名前のタップ状態を取る関数をViewController内に追加しました。
moviePlayer内でif isTapped...の文を書かずにタップだけ拾えているかprint文で見た所拾えていましたが上のコードではタップしても一度も反応しません…
if文は一度しか判定をしないということなのでしょうか…?
回答1件
あなたの回答
tips
プレビュー