ios - 如何让按钮根据按下的行显示不同的视频?

标签 ios swift uitableview video tableview

目前,我的代码设置为每个 TableView 单元格中都有一个按钮,按下后会显示视频。每个表格 View 单元格行都包含按钮(有 x 个单元格),但是无论点击哪一行按钮,它总是会导致相同的视频。有没有办法根据按钮所在的行来显示视频?我的代码当前只有一个视频文件,但我怎样才能根据点击按钮的单元格,使其显示特定的视频?例如,如果点击第一行的按钮,我希望它显示某个视频,第二行、第三行也同样显示,依此类推。现在它们都显示相同的视频。

这是我的表格 View 单元格代码:

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

表格 View 代码:

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

最佳答案

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

首先在名为 setupPlayerViewVideoPlayerView 方法中进行更改。将您的实现替换为:

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中进行更改,在videoURLs中进行更改,我添加了一个新变量 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


        })



}

关于ios - 如何让按钮根据按下的行显示不同的视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45657536/

相关文章:

objective-c - 将 valuePath 绑定(bind)到 NSImageView 会导致 NSImageView.image 在将新图像拖动到 imagewell 时返回 nil

iOS 在整个应用程序中更改 NavigationBar 外观

swift - 如何使用 Vapor (流畅迁移)将字段从必需更新为可选?

ios - 如何防止用户从滑出设置菜单中连续两次调用同一 View Controller ?

ios - 订阅自定义 UIView 的变量

ios - 底部 2 行未在我的 tableview 中注册触摸

iphone - 点击UITableView时resignFirstResponder?

ios - UITableView滑动编辑

c# - 访问路径 '/iPhoneSimulator/Debug/ibtool-manifests'被拒绝

ios - 如何通过应用程序扩展 (iWatch) 取消预定的本地通知(在 iPhone 上)