如何让按钮播放不同的视频取决于它所在的行?

时间:2017-08-14 01:40:01

标签: ios swift uitableview video cell

我有一个包含按钮的自定义单元格的表格视图。根据选择按钮的行,我想要播放特定的视频文件。但是现在我的代码设置方式无论按下按钮的哪一行都显示相同的视频文件。我如何配置我的代码以确保每一行显示我喜欢的不同视频?

表格视图代码:

import UIKit
import AVKit
import AVFoundation

class DrillsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var player: AVPlayer?
var arrayForKey2 = [[String]]()
var keyIndex = Int()
var headLabel = String()
var labels = Array(trainingDict.keys)

@IBOutlet weak var tableView: DrillsTableView!

@IBOutlet weak var drillLabel: UILabel!

@IBOutlet weak var labelBackground: UIView!


@IBAction func back(_ sender: Any) {
    performSegue(withIdentifier: "back", sender: self)
}



public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{

    return arrayForKey2.count
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell" , for: indexPath) as! DrillsTableViewCell



    //clear background color needed in order to display gradient cell
    cell.backgroundColor = UIColor.clear

    //gradient configuration
    gradient = CAGradientLayer()
    gradient.frame = tableView.bounds
    gradient.colors = [UIColor.black.cgColor, UIColor.darkGray.cgColor, UIColor.black.cgColor]
    tableView.layer.insertSublayer(gradient, at: 0)
    gradient.startPoint = CGPoint(x: 0.0, y: 0.0)
    gradient.endPoint = CGPoint(x: 1.0, y: 1.0)





//Possible method for 'drillLabel' gradient
    //drillLabelGradient = CAGradientLayer()
    //drillLabelGradient.frame = labelBackground.bounds
    //drillLabelGradient.colors = [UIColor.red.cgColor, UIColor.darkGray.cgColor, UIColor.black.cgColor]
    //labelBackground.layer.insertSublayer(drillLabelGradient, at: 0)
    //drillLabelGradient.startPoint = CGPoint(x: 0.0, y: 0.0)
    //drillLabelGradient.endPoint = CGPoint(x: 1.0, y: 1.0)
    drillLabel.font = UIFont(name: "Symbol", size: 24.0)

    //attributes for watch/play button

    cell.playButton.layer.shadowColor = UIColor.black.cgColor
    cell.playButton.layer.shadowOffset = CGSize(width: 2, height: 2)
    cell.playButton.layer.shadowOpacity = 0.7
    cell.playButton.layer.shadowRadius = 1

    //details for cell label display
    cell.borderWidth = 1.5
    cell.borderColor = UIColor.white
    cell.drillTitle.text = "\(arrayForKey2[keyIndex][indexPath.row])"
    cell.drillTitle.font = UIFont(name: "Symbol", size: 18.0)
    cell.drillTitle.textColor = UIColor.white

    return cell
}




override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self
    drillLabel.text = labels[keyIndex]

       }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


 }

表格视图单元格的代码:

   import UIKit
  import AVFoundation
  import AVKit

  class VideoPlayerView: UIView {

let pauseButton: UIButton = {
    let button = UIButton(type: .system)
    button.setImage(#imageLiteral(resourceName: "Triangle 2"), for: .normal)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.tintColor = UIColor.white
    button.isHidden = false
    button.addTarget(self, action: #selector(handlePause), for: .touchUpInside)

    return button
}()

var isPlaying = false

func handlePause() {
    if isPlaying {
        player?.pause()
    pauseButton.alpha = 1.0 }

    else { player?.play()
        pauseButton.alpha = 0.01
    }

    isPlaying = !isPlaying
}

//container view that holds sublayers for the video control objects
let controlsContainerView: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor(white: 0, alpha: 1.0)
    return view
}()


override init(frame: CGRect) {
    super.init(frame: frame)

    setupPlayerView()

    //configures container view (video's background)
    controlsContainerView.frame = frame
    addSubview(controlsContainerView)
    backgroundColor = UIColor.black


    //following adds pause/play button to video
    controlsContainerView.addSubview(pauseButton)
    pauseButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
    pauseButton.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true


}

var player: AVPlayer?

//function that sets up video playback
private func setupPlayerView() {



    //variable that contains video url
    let fileUrl = URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/dunk.mov")




        player = AVPlayer(url: fileUrl)

    //video only renders if you specify 'playerLayer'
        let playerLayer = AVPlayerLayer(player: player)
        self.layer.insertSublayer(playerLayer, at: 1)
        playerLayer.frame = frame


        player?.play()


        //attached obeserver of 'player' to tell when 'player' is ready
        player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)

}
//method called every time you add obserever to an object
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    //strring that lets AVPlayer know its ready
    if keyPath == "currentItem.loadedTimeRanges" {

        //configures container view while video is playing
        controlsContainerView.backgroundColor = UIColor.clear
        pauseButton.alpha = 0.05
        isPlaying = true

    }
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

 class DrillsTableViewCell: UITableViewCell {

var videoURL:[URL] = [URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/dunk.mov"), URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/mk.MOV")]
var video = URL(fileURLWithPath: String())


@IBOutlet weak var logoImage: UIImageView!

@IBOutlet weak var drillTitle: UILabel!


@IBOutlet weak var playButton: UIButton!
@IBAction func watchButton(_ sender: Any) {
    print(123)


        //controls video background view
        if let keyWindow = UIApplication.shared.keyWindow {
            let view = UIView(frame: keyWindow.frame)
            view.backgroundColor = UIColor.white


           view.frame = CGRect(x: 0.0, y: 0.0, width: keyWindow.frame.width, height: keyWindow.frame.height)

            let videoPlayerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.width * 9 / 16)
            let videoPlayerView = VideoPlayerView(frame: videoPlayerFrame)
            view.addSubview(videoPlayerView)


            keyWindow.addSubview(view)
            UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseOut, animations: {

                    view.frame = keyWindow.frame

            }, completion: { (completedAnimation) in
                //possible features implemented later
                UIApplication.shared.isStatusBarHidden = true


            })



    }

}

}

1 个答案:

答案 0 :(得分:1)

首先,您需要在VideoPlayerView课程中添加一个var,其中包含您将在课堂上播放的网址

fileprivate var videoUrl : URL?

并修改您的VideoPlayerView setupPlayerView方法以传递类似这样的网址

private func setupPlayerView(url:URL)

之后,您需要在DrillsTableViewCell

中替换这一行
var videoURL:[URL] = [URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/dunk.mov"), URL(fileURLWithPath: "/Users/jordanlagrone/Desktop/BlackHeartBB/BlackHeartBB/mk.MOV")]
var video = URL(fileURLWithPath: String())

这一个

var videoURL:URL?

以及您需要添加的watchButton操作

videoPlayerView.setupPlayerView(self.videoURL!)

之后你就可以在你的cellForRowAtIndexPath中添加这一行

if let urlValid = URL(string: arrayForKey2[indexPath.row].first)
{
cell.videoURL = urlValid
}

之后你的应用必须正常工作

完整代码VideoPlayerView

  import UIKit
  import AVFoundation
  import AVKit

  class VideoPlayerView: UIView {

  fileprivate var videoUrl : URL?

let pauseButton: UIButton = {
    let button = UIButton(type: .system)
    button.setImage(#imageLiteral(resourceName: "Triangle 2"), for: .normal)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.tintColor = UIColor.white
    button.isHidden = false
    button.addTarget(self, action: #selector(handlePause), for: .touchUpInside)

    return button
}()

var isPlaying = false

func handlePause() {
    if isPlaying {
        player?.pause()
    pauseButton.alpha = 1.0 }

    else { player?.play()
        pauseButton.alpha = 0.01
    }

    isPlaying = !isPlaying
}

//container view that holds sublayers for the video control objects
let controlsContainerView: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor(white: 0, alpha: 1.0)
    return view
}()


override init(frame: CGRect) {
    super.init(frame: frame)

    setupPlayerView()

    //configures container view (video's background)
    controlsContainerView.frame = frame
    addSubview(controlsContainerView)
    backgroundColor = UIColor.black


    //following adds pause/play button to video
    controlsContainerView.addSubview(pauseButton)
    pauseButton.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
    pauseButton.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true


}

var player: AVPlayer?

//function that sets up video playback
private func setupPlayerView(url:URL) {
    //variable that contains video url
    self.videoUrl = url

    player = AVPlayer(url: self.videoUrl)

    //video only renders if you specify 'playerLayer'
        let playerLayer = AVPlayerLayer(player: player)
        self.layer.insertSublayer(playerLayer, at: 1)
        playerLayer.frame = frame


        player?.play()


        //attached obeserver of 'player' to tell when 'player' is ready
        player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)

}
//method called every time you add obserever to an object
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    //strring that lets AVPlayer know its ready
    if keyPath == "currentItem.loadedTimeRanges" {

        //configures container view while video is playing
        controlsContainerView.backgroundColor = UIColor.clear
        pauseButton.alpha = 0.05
        isPlaying = true

    }
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
}

完整代码DrillsTableViewCell

class DrillsTableViewCell: UITableViewCell {

var videoURL:URL?

@IBOutlet weak var logoImage: UIImageView!

@IBOutlet weak var drillTitle: UILabel!


@IBOutlet weak var playButton: UIButton!
@IBAction func watchButton(_ sender: Any) {
    print(123)
       guard self.videoURL != nil else{
             return
        }

        //controls video background view
        if let keyWindow = UIApplication.shared.keyWindow {
            let view = UIView(frame: keyWindow.frame)
            view.backgroundColor = UIColor.white


           view.frame = CGRect(x: 0.0, y: 0.0, width: keyWindow.frame.width, height: keyWindow.frame.height)

            let videoPlayerFrame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.width * 9 / 16)
            let videoPlayerView = VideoPlayerView(frame: videoPlayerFrame)
            videoPlayerView.setupPlayerView(self.videoURL!) //added
            view.addSubview(videoPlayerView)


            keyWindow.addSubview(view)
            UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseOut, animations: {

                    view.frame = keyWindow.frame

            }, completion: { (completedAnimation) in
                //possible features implemented later
                UIApplication.shared.isStatusBarHidden = true


            })



    }

}

此代码未经过测试,如果有一些问题请告诉我 希望这有帮助