UITableView Cell覆盖有UIProgressView并随着音频播放而更新

时间:2018-08-26 23:09:17

标签: ios uitableview swift4 uiprogressview

我正在寻找可以以编程方式帮助我在UIProgressView上添加UITableViewCell的帖子/链接/指南。目前,我按住的每个单元播放从 Firebase 流式传输的音频,放开时,音频停止。我想添加一个ProgressView,它首先以清晰的色调覆盖单元的整个框架,但变为浅蓝色或其他颜色,以描述其从左到右的进度。音频的持续时间将确定进度视图的速度。我已经搜索了SO,只能找到几年前用 Obj C 编写的similar posts;寻找使用最新的Swift语言编写的内容。以下是我在Google上搜索到的随机gif,它显示了我在寻找什么。任何帮助将不胜感激。

enter image description here

更新1: 我要求得到持续时间并适用于进度。 UIProgressView记录进度从左到右的持续时间。现在唯一的问题是,当我按下 any 单元格来播放其各自的音频时,会播放 first 单元格的进度条。下面是我正在使用的代码。

@objc func updateProgress(){
    let duration = Float((player.currentItem?.duration.seconds)!)
    let currentTime = Float((player.currentItem?.currentTime().seconds)!)
    let progressTotal = currentTime/duration

    let indexPath = IndexPath(row: self.tag, section: 0)
    if progressTotal > 0 {
        if let cell = tableView.cellForRow(at: indexPath) as? PostTableViewCell {
            if currentTime != duration || currentTime/duration != 1 {
                cell.progressBar.progress = progressTotal
                cell.progressBar.progressTintColor = UIColor.blue
            } else {
                timer?.invalidate()
                if timer != nil {
                    timer?.invalidate()
                    timer = nil
                    print("Timer Stopped")
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以在表格视图单元格中获取 UIProgressView ,并通过诸如波纹管这样的扩展程序设置进度条的日高度

extension UIProgressView {

@IBInspectable var barHeight : CGFloat {
    get {
        return transform.d * 2.0
    }
    set {
        // 2.0 Refers to the default height of 2
        let heightScale = newValue / 2.0
        let c = center
        transform = CGAffineTransform(scaleX: 1.0, y: heightScale)
        center = c
    }
}}

,您可以从情节提要中进行设置 enter image description here

现在您可以通过重新加载单个单元格来管理进度 请使用我可以使用歌曲计时器管理的时间来完成下面的代码,

class ProgressCell: UITableViewCell {
@IBOutlet weak var lblTitle: UILabel!
@IBOutlet weak var progressBar: UIProgressView!}

class ViewController: UIViewController {

var progress = 0.0
var progressTimer: Timer!

@IBOutlet weak var tblProgress: UITableView!

func reloadProgress(at index: Int) {
    let indexPath = IndexPath(row: index, section: 0)

    // start the timer
    progressTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(timerAction), userInfo: ["indexPath":indexPath], repeats: true)
}

// called every time interval from the timer
@objc func timerAction() {
    progress += 0.05
    if Int(progress) == 1 {
        progressTimer.invalidate()
    }else{
    let indexPath = (progressTimer.userInfo as! [String:Any])["indexPath"] as! IndexPath
    tblProgress.reloadRows(at: [indexPath], with: .none)
    }
}}

extension ViewController: UITableViewDataSource,UITableViewDelegate {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 3
}

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

    cell.lblTitle.text = "house of highlights"
    cell.progressBar.progress = Float(progress)
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    progress = 0.0
    reloadProgress(at: indexPath.row)
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
}}