如何在swift 3中将Swipe Gesture添加到AVPlayer [英] How can I add Swipe Gesture to AVPlayer in swift 3

查看:91
本文介绍了如何在swift 3中将Swipe Gesture添加到AVPlayer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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。错误的选择器目标您对上的目标做出错误的假设,让swipeRight = UISwipeGestureRecognizer(目标:sView,操作:#selector(self.respondToSwipeGesture))。您正在将目标设置为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.

此处target表示选择器方法的目标对象。因此,将目标更改为自身(即视图控制器)将使您的视图控制器成为选择器方法的目标 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中将Swipe Gesture添加到AVPlayer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆