如何在 swift 3 中向 AVPlayer 添加滑动手势 [英] How can I add Swipe Gesture to AVPlayer in swift 3

查看:27
本文介绍了如何在 swift 3 中向 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.选择器的目标错误 您在 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屋!

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