How can I add Swipe Gesture to AVPlayer in swift 3

前端 未结 4 806
天命终不由人
天命终不由人 2021-01-01 04:51

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

相关标签:
4条回答
  • 2021-01-01 05:41

    Probably you need to initialize your sView properly. Make sure you assigned needed frame to sView and added it to self.view as a subview.

    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 ...
    }
    
    0 讨论(0)
  • 2021-01-01 05:44

    Swift 4

    You can do it without sView, just add a gesture recognizer to AVPlayerViewController's view:

    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")
    }
    
    0 讨论(0)
  • 2021-01-01 05:47

    There are two mistakes on your code.

    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. 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.

    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)

    please refer the following corrected code.

    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)
    }
    
    0 讨论(0)
  • 2021-01-01 05:56

    You should do this:playerController.view.addSubview(self.sView) instead of self.view.addSubview(sView)

    And you should add self as tagart just like this: let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(respondToSwipeGesture))

    It will work . This is my console:https://i.stack.imgur.com/agaBx.jpg

    0 讨论(0)
提交回复
热议问题