如何在swift 3中将Swipe Gesture添加到AVPlayer

我正在使用Swift 3,我想向AVPlayer添加滑动手势。 有人告诉我,为了做到这一点,我必须使用另一个视图,并将该视图带到video的顶部 – 所以我做了,这是我的代码:( 但没有工作 ):(

 import UIKit import AVKit import AVFoundation class ViewController: UIViewController , UIAlertViewDelegate { let myFirstButton = UIButton() let mySecondButton = UIButton() var scoreLabel = UILabel() var Player = AVPlayer() var swipeGesture = UIGestureRecognizer() var sView = UIView() override func viewDidLoad() { super.viewDidLoad() //////////// sView.frame = self.view.frame self.view.addSubview(sView) self.view.bringSubview(toFront: sView) //////Swipe Gesture let swipeRight = UISwipeGestureRecognizer(target: sView, action: #selector(self.respondToSwipeGesture)) swipeRight.direction = UISwipeGestureRecognizerDirection.right self.sView.addGestureRecognizer(swipeRight) let swipeLeft = UISwipeGestureRecognizer(target: sView, action: #selector(self.respondToSwipeGesture)) swipeLeft.direction = UISwipeGestureRecognizerDirection.left self.sView.addGestureRecognizer(swipeLeft) let swipeUp = UISwipeGestureRecognizer(target: sView, action: #selector(self.respondToSwipeGesture)) swipeUp.direction = UISwipeGestureRecognizerDirection.up self.sView.addGestureRecognizer(swipeUp) let swipeCustom = UISwipeGestureRecognizer(target: sView, action: #selector(self.respondToSwipeGesture)) swipeCustom.direction = UISwipeGestureRecognizerDirection.init(rawValue: 200) self.sView.addGestureRecognizer(swipeCustom) let swipeDown = UISwipeGestureRecognizer(target: sView, action: #selector(self.respondToSwipeGesture)) swipeDown.direction = UISwipeGestureRecognizerDirection.down self.sView.addGestureRecognizer(swipeDown) //////////////////////End Swipe Gesture let currentPlayerItem = Player.currentItem let duration = currentPlayerItem?.asset.duration let currentTime = Float(self.Player.currentTime().value) if currentTime >= 5 { print("OK") }else if currentTime <= 5 { print("NO") } NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.Player.currentItem, queue: nil, using: { (_) in DispatchQueue.main.async { self.Player.seek(to: kCMTimeZero) self.Player.play() } }) ///////////// NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.Player.currentItem, queue: nil, using: { (_) in DispatchQueue.main.async { self.Player.seek(to: kCMTimeZero) self.Player.play() DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5.0) { // check if player is still playing if self.Player.rate != 0 { print("OK") print("Player reached 5 seconds") } } } }) } fileprivate var firstAppear = true //////Swipe Gesture func respondToSwipeGesture(gesture: UIGestureRecognizer) { if let swipeGesture = gesture as? UISwipeGestureRecognizer { switch swipeGesture.direction { case UISwipeGestureRecognizerDirection.right: print("Swiped right") case UISwipeGestureRecognizerDirection.down: print("Swiped down") case UISwipeGestureRecognizerDirection.left: print("Swiped left") case UISwipeGestureRecognizerDirection.up: print("Swiped up") case UISwipeGestureRecognizerDirection.init(rawValue: 200): print("Swiped Custom") default: break } } } /////////End Swipe Gesture override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let value = UIInterfaceOrientation.landscapeLeft.rawValue UIDevice.current.setValue(value, forKey: "orientation") if firstAppear { do { try playBackgroundMovieVideo() firstAppear = false } catch AppError.invalidResource(let NMNF6327, let m4v) { debugPrint("Could not find resource \(NMNF6327).\(m4v)") } catch { debugPrint("Generic error") } } } override var supportedInterfaceOrientations: UIInterfaceOrientationMask{ return UIInterfaceOrientationMask.landscapeLeft } fileprivate func playBackgroundMovieVideo() throws { guard let path = Bundle.main.path(forResource: "NMNF6327", ofType:"m4v") else { throw AppError.invalidResource("NMNF6327", "m4v") } self.Player = AVPlayer(url: URL(fileURLWithPath: path)) let playerController = AVPlayerViewController() playerController.showsPlaybackControls = false playerController.view.isUserInteractionEnabled = true playerController.player = self.Player playerController.viewWillLayoutSubviews() playerController.allowsPictureInPicturePlayback = false myFirstButton.setImage(#imageLiteral(resourceName: "pause.png"), for: UIControlState.normal) myFirstButton.frame = CGRect(x: 5, y: 5, width: 70, height: 50) self.myFirstButton.addTarget(self, action:#selector(self.myFirstButtonpressed), for: .touchUpInside) self.view.addSubview(myFirstButton) playerController.view.addSubview(myFirstButton) mySecondButton.setImage(#imageLiteral(resourceName: "Options.png"), for: UIControlState.normal) mySecondButton.frame = CGRect(x: 60, y: 5, width: 70, height: 50) self.mySecondButton.addTarget(self, action:#selector(self.mySecondButtonClicked), for: .touchUpInside) self.view.addSubview(mySecondButton) playerController.view.addSubview(mySecondButton) self.present(playerController, animated: false) { self.Player.play() } } func playerDidReachEnd(notification: NSNotification) { self.Player.seek(to: kCMTimeZero) self.Player.play() } func myFirstButtonpressed(sender: UIButton!) { myFirstButton.setImage(#imageLiteral(resourceName: "Play.png"), for: UIControlState.normal) let alertView = UIAlertView(); alertView.addButton(withTitle: "Continue"); alertView.delegate=self; alertView.addButton(withTitle: "restart"); alertView.addButton(withTitle: "Middle"); alertView.title = "PAUSE"; alertView.message = ""; alertView.show(); let playerController = AVPlayerViewController() playerController.viewWillLayoutSubviews() self.present(playerController , animated: true) self.Player.pause() } func mySecondButtonClicked(){ } func alertView(_ alertView: UIAlertView, clickedButtonAt buttonIndex: Int) { if buttonIndex == 0 { self.Player.play() myFirstButton.setImage(#imageLiteral(resourceName: "pause.png"), for: UIControlState.normal) print("Continue") } else if buttonIndex == 1 { self.Player.seek(to: kCMTimeZero) self.Player.play() myFirstButton.setImage(#imageLiteral(resourceName: "pause.png"), for: UIControlState.normal) } ////Middle else if buttonIndex == 2 { myFirstButton.setImage(#imageLiteral(resourceName: "pause.png"), for: UIControlState.normal) let timeScale = self.Player.currentItem?.asset.duration.timescale; let time = CMTimeMakeWithSeconds( +9 , timeScale!) self.Player.seek(to: time, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) self.Player.play() } } override var shouldAutorotate: Bool{ return false } func update() { myFirstButton.isHidden=false } } enum AppError : Error { case invalidResource(String, String) } 

你的代码有两个错误。

1.在错误的控制器视图上添加手势视图。 你没有在AVPlayerViewController()中添加手势视图,而是添加了初始控制器,在呈现之后将被AVPlayerViewController()覆盖。

3.错误的选择器目标你在let swipeRight = UISwipeGestureRecognizer(target: sView, action: #selector(self.respondToSwipeGesture))上做了关于目标的错误假设。 您正在将目标设置为sView并在ViewController上实现选择器方法。

这里target表示选择器方法的目标对象。 因此,将目标更改为self(即视图控制器)将使视图控制器成为选择器方法的目标func respondToSwipeGesture(gesture: UIGestureRecognizer)

请参阅以下更正的代码。

 import UIKit import AVKit import AVFoundation class ViewController: UIViewController , UIAlertViewDelegate { let myFirstButton = UIButton() let mySecondButton = UIButton() var scoreLabel = UILabel() var Player = AVPlayer() var swipeGesture = UIGestureRecognizer() var sView = UIView() override func viewDidLoad() { super.viewDidLoad() let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture)) swipeRight.direction = UISwipeGestureRecognizerDirection.right self.sView.addGestureRecognizer(swipeRight) let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture)) swipeLeft.direction = UISwipeGestureRecognizerDirection.left self.sView.addGestureRecognizer(swipeLeft) let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture)) swipeUp.direction = UISwipeGestureRecognizerDirection.up self.sView.addGestureRecognizer(swipeUp) let swipeCustom = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture)) swipeCustom.direction = UISwipeGestureRecognizerDirection.init(rawValue: 200) self.sView.addGestureRecognizer(swipeCustom) let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture)) swipeDown.direction = UISwipeGestureRecognizerDirection.down self.sView.addGestureRecognizer(swipeDown) //////////////////////End Swipe Gesture let currentPlayerItem = Player.currentItem let duration = currentPlayerItem?.asset.duration let currentTime = Float(self.Player.currentTime().value) if currentTime >= 5 { print("OK") }else if currentTime <= 5 { print("NO") } NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.Player.currentItem, queue: nil, using: { (_) in DispatchQueue.main.async { self.Player.seek(to: kCMTimeZero) self.Player.play() } }) ///////////// NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.Player.currentItem, queue: nil, using: { (_) in DispatchQueue.main.async { self.Player.seek(to: kCMTimeZero) self.Player.play() DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5.0) { // check if player is still playing if self.Player.rate != 0 { print("OK") print("Player reached 5 seconds") } } } }) } fileprivate var firstAppear = true //////Swipe Gesture func respondToSwipeGesture(gesture: UIGestureRecognizer) { if let swipeGesture = gesture as? UISwipeGestureRecognizer { switch swipeGesture.direction { case UISwipeGestureRecognizerDirection.right: print("Swiped right") case UISwipeGestureRecognizerDirection.down: print("Swiped down") case UISwipeGestureRecognizerDirection.left: print("Swiped left") case UISwipeGestureRecognizerDirection.up: print("Swiped up") case UISwipeGestureRecognizerDirection.init(rawValue: 200): print("Swiped Custom") default: break } } } /////////End Swipe Gesture override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) let value = UIInterfaceOrientation.landscapeLeft.rawValue UIDevice.current.setValue(value, forKey: "orientation") if firstAppear { do { try playBackgroundMovieVideo() firstAppear = false } catch AppError.invalidResource(let NMNF6327, let m4v) { debugPrint("Could not find resource \(NMNF6327).\(m4v)") } catch { debugPrint("Generic error") } } } override var supportedInterfaceOrientations: UIInterfaceOrientationMask{ return UIInterfaceOrientationMask.landscapeLeft } fileprivate func playBackgroundMovieVideo() throws { guard let path = Bundle.main.path(forResource: "NMNF6327", ofType:"m4v") else { throw AppError.invalidResource("NMNF6327", "m4v") } self.Player = AVPlayer(url: URL(fileURLWithPath: path)) let playerController = AVPlayerViewController() playerController.showsPlaybackControls = false playerController.view.isUserInteractionEnabled = true playerController.player = self.Player playerController.viewWillLayoutSubviews() playerController.allowsPictureInPicturePlayback = false myFirstButton.setImage(#imageLiteral(resourceName: "pause.png"), for: UIControlState.normal) myFirstButton.frame = CGRect(x: 5, y: 5, width: 70, height: 50) self.myFirstButton.addTarget(self, action:#selector(self.myFirstButtonpressed), for: .touchUpInside) self.view.addSubview(myFirstButton) mySecondButton.setImage(#imageLiteral(resourceName: "Options.png"), for: UIControlState.normal) mySecondButton.frame = CGRect(x: 60, y: 5, width: 70, height: 50) self.mySecondButton.addTarget(self, action:#selector(self.mySecondButtonClicked), for: .touchUpInside) self.view.addSubview(mySecondButton) sView.frame = self.view.frame playerController.view.addSubview(sView) playerController.view.bringSubview(toFront: sView) // ****** buttons are added after sview ********** playerController.view.addSubview(myFirstButton) playerController.view.addSubview(mySecondButton) self.present(playerController, animated: false) { self.Player.play() } } func playerDidReachEnd(notification: NSNotification) { self.Player.seek(to: kCMTimeZero) self.Player.play() } func myFirstButtonpressed(sender: UIButton!) { myFirstButton.setImage(#imageLiteral(resourceName: "Play.png"), for: UIControlState.normal) let alertView = UIAlertView(); alertView.addButton(withTitle: "Continue"); alertView.delegate=self; alertView.addButton(withTitle: "restart"); alertView.addButton(withTitle: "Middle"); alertView.title = "PAUSE"; alertView.message = ""; alertView.show(); let playerController = AVPlayerViewController() playerController.viewWillLayoutSubviews() self.present(playerController , animated: true) self.Player.pause() } func mySecondButtonClicked(){ } func alertView(_ alertView: UIAlertView, clickedButtonAt buttonIndex: Int) { if buttonIndex == 0 { self.Player.play() myFirstButton.setImage(#imageLiteral(resourceName: "pause.png"), for: UIControlState.normal) print("Continue") } else if buttonIndex == 1 { self.Player.seek(to: kCMTimeZero) self.Player.play() //myFirstButton.setImage(#imageLiteral(resourceName: "pause.png"), for: UIControlState.normal) } ////Middle else if buttonIndex == 2 { myFirstButton.setImage(#imageLiteral(resourceName: "pause.png"), for: UIControlState.normal) let timeScale = self.Player.currentItem?.asset.duration.timescale; let time = CMTimeMakeWithSeconds( +9 , timeScale!) self.Player.seek(to: time, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero) self.Player.play() } } override var shouldAutorotate: Bool{ return false } func update() { myFirstButton.isHidden=false } } enum AppError : Error { case invalidResource(String, String) } 

可能你需要正确初始化你的sView。 确保为sView指定了所需的框架,并将其作为子视图添加到self.view中。

 override func viewDidLoad() { super.viewDidLoad() sView.frame = self.view.frame self.view.addSubview(sView) self.view.bringSubview(toFront: sView) // add you gestures to sView here ... } 

你应该这样做: playerController.view.addSubview(self.sView)而不是self.view.addSubview(sView)

你应该像这样添加self作为tagart: let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(respondToSwipeGesture))

它会工作。 这是我的控制台: https : //i.stack.imgur.com/agaBx.jpg