我正在使用Swift 3,我想向AVPlayer
添加滑动手势。有人告诉我,为了做到这一点,我必须使用另一个视图,并将该视图带到视频的顶部 - 所以我做了,这是我的代码:(但没有工作 ):(
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)
}
答案 0 :(得分:4)
您的代码有两个错误。
<强> 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)
}
答案 1 :(得分:1)
雨燕4
您可以在没有sView的情况下执行此操作,只需将手势识别器添加到AVPlayerViewController的视图中即可:
func playVideo() {
let playerController = AVPlayerViewController()
playerController.player = AVPlayer(url: URL(fileURLWithPath: videoPath))
playerController.showsPlaybackControls = false
playerController.view.isUserInteractionEnabled = true
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
swipeUp.direction = UISwipeGestureRecognizerDirection.up
playerController.view.addGestureRecognizer(swipeUp)
present(playerController, animated: false) {
playerController.player?.play()
}
}
@objc func respondToSwipeGesture(gesture: UIGestureRecognizer) {
print("swipe up")
}
答案 2 :(得分:0)
您可能需要正确初始化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 ...
}
答案 3 :(得分:0)
您应该这样做: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