如何在 swift 3 中向 AVPlayer 添加滑动手势 [英] How can I add Swipe Gesture to AVPlayer in swift 3
问题描述
我正在使用 Swift 3,我想向 AVPlayer
添加滑动手势.有人告诉我,为了做到这一点,我必须使用另一个视图并将该视图带到视频的顶部 - 所以我做到了,这是我的代码:(但没有用) :(
I am using Swift 3 and I want to add swipe gesture to AVPlayer
. Somebody told me that in order to do this I have to use another view and bring that view to the top of the video - So I did it, and here is my code: (But didn't work) :(
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() 覆盖.
1. Adding gesture view on wrong controller's view. Instead of adding gesture view to AVPlayerViewController() you were adding on initial controller, which will get covered by AVPlayerViewController() after presenting.
3.选择器的目标错误 您在 let swipeRight = UISwipeGestureRecognizer(target: sView, action: #selector(self.respondToSwipeGesture))
上对 target 做出了错误的假设.您将目标设置为 sView 并在 ViewController 上实现选择器方法.
3. Wrong selector's target You were making false assumption about target on let swipeRight = UISwipeGestureRecognizer(target: sView, action: #selector(self.respondToSwipeGesture))
. You were setting target to sView and implementing selector method on ViewController.
这里的目标是选择器方法的目标对象.因此,将目标更改为 self(即您的视图控制器)将使您的视图控制器成为选择器方法的目标 func respondToSwipeGesture(gesture: UIGestureRecognizer)
Here target means the target object for selector method. So Changing target to self (i.e. your view controller) will make your view controller a target for selector method 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)
}
这篇关于如何在 swift 3 中向 AVPlayer 添加滑动手势的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!