2017-08-13 101 views
0

目前我有我的代码安装到每个表格视图单元格中有一个按钮后,按下后​​显示一个视频。每个表格视图单元格行都包含按钮(有x个单元格),但无论按钮在哪个行中点击,总是会导致相同的视频。有没有办法根据按钮所在的行在哪里显示视频?我的代码目前只有一个视频文件,但是如何根据点击该按钮的单元格将其显示在哪里,它会显示特定的视频?例如,如果在第一行中点击按钮,我希望它显示某个视频,而对于两个和三个等等,则需要显示相同的视频。现在他们都显示相同的视频。如何让按钮根据按下的行显示不同的视频?

这里是我的表视图单元代码:

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 player: AVPlayer? 
    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 
    }() 

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

    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 
    } 

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

     } 
    } 
} 

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 
       } 
      ) 
     } 
    } 
} 

代码表视图:

class DrillsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    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 
     cell.playButton.tag = indexPath.row 


     //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 
     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] 
    } 
} 
+1

如果您没有显示相关的表格视图代码和按钮处理代码,没有人能提供帮助。 – rmaddy

+1

这是“UIView”的代码,而不是“UITableViewCell” –

+0

我添加了认可代码 –

回答

1

首先你要区分在细胞中添加的按钮通过在tableView:cellForRowAtIndexPath中给它们添加标签值:方法

cell.button.tag = indexpath.row 

这将为每个单元格中存在的按钮设置不同的标签值。 然后在下面添加到它:

cell.button.addTarget(self, action:(YourController.buttonMethodPlayVideo(:)) , forControlEvents: .TouchUpInside) 

创建方法按钮上点击执行操作:

func buttonMethodPlayVideo(sender: UIButton) { 
    print(sender.tag) 
    } 

在上述方法时,你会点击按钮,你会得到不同的标记值。 根据该值,您可以播放不同的视频或传递不同的视频名称给玩家玩vudeo。

+0

谢谢,还没有实现代码,但这是非常明确的,似乎适用!现在尝试... –

+0

我已经添加了更多代码来帮助更好地解释我的问题。这是否改变了我的问题的解决方案? –

+0

欢迎@CaptainCode。 – Amit

2

我相信你应该重构你的代码来获得所需的行为。请检查下面的代码:

首先要在VideoPlayerView方法改变命名setupPlayerView .Replace您实现这一点:

func setupPlayerView(for url: URL) { 




    player = AVPlayer(url: url) 

//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) 

    } 

现在使DrillsTableViewCell变化,使videosURLs变化,我增加了一个新的变量singleVideoURL,新的类将是这样的:

class DrillsTableViewCell: UITableViewCell { 

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




    @IBOutlet weak var logoImage: UIImageView! 

    @IBOutlet weak var drillTitle: UILabel! 


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


    //controls video background view 
    if let keyWindow = UIApplication.shared.keyWindow { 
     let view = UIView(frame: keyWindow.frame) 
     view.backgroundColor = UIColor.white 
     var singleVideoURL = videoURLs[sender.tag] 

     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(for: singleVideoURL) 
     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 


     }) 



} 
+0

这段代码并没有完成我想要做的事情。这很简单。如果在第1行轻击按钮,我想要播放特定的视频,第2行和第3行也是如此。按钮应该知道它被按下的行,并且取决于它在特定视频中的行(与该行相关联)应该玩。 –

+0

@CaptainCode上面的代码将从videoURLs数组中选择url,比方说第0行中的按钮被点击,在你的tableview中,你将indexPath.row传递给button.tag,所以它将会是0,并且它将在action方法中出现,它会从videoURLs的0索引处选择视频网址并播放它,不是你想要的吗?请纠正,如果我错了 – 3stud1ant3

+0

是的,这是我想要完成的。 –

0

设置一个数组来把你的视频的路径进入,其indexe应该匹配单元的索引。另外,您可以将单元格的行号传递给内部按钮作为其标签。所以当您点击该按钮时,您可以通过按钮的标签在阵列中找到特定的视频路径。

相关问题