ios - 在 TableView 中更改图像按钮

标签 ios swift uitableview tableview avaudioplayer

我在 tableView 中有一个音频播放器,它可以在按钮的帮助下工作。问题是:单击按钮时如何更改按钮的图标。我设法更改了图标,但它无法正常工作,并且当我按下按钮 2 次时速度明显变慢。

GIF 的工作原理:

enter image description here

var boolValue = false

class TableViewControllerAudioList: UIView,UITableViewDelegate,UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!

var avplayer:AVPlayer!




override func setNeedsDisplay() {
    super.setNeedsDisplay()


}



 func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return modalsF.count
}


 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCellAudioList


    cell.name.text = modalsF[indexPath.row].AudioName
    cell.duration.text = "00:00"
    cell.number.text = "\(indexPath.row + 1)"

    cell.playChange.tag = indexPath.row
    cell.playChange.addTarget(self, action: #selector(tickClicked), for: .touchUpInside)

    cell.tapAction = { (cell) in


   // self.player = self.setupAudioPlayerWithFile(file: "https:---.com" + modalsF[indexPath.row].UrlName! as NSString, type: "mp3")

    self.avplayer = self.pl(file: "https:---.com" + modalsF[indexPath.row].UrlName! as NSString)


       // self.play(tableView.indexPath(for: cell)!.row)

        }


     return cell
}



func tickClicked(_ sender: UIButton!) {
    print(sender.tag)
    let cellTop = tableView.cellForRow(at: NSIndexPath(row: sender.tag, section: 0) as IndexPath) as!TableViewCellAudioList

    if boolValue == false{
        cellTop.playChange.setImage(UIImage(named:"Pause.png"), for: UIControlState.normal)
        boolValue = true
    } else {
        cellTop.playChange.setImage(UIImage(named:"Play.png"), for: UIControlState.normal)
        boolValue = false
    }
}

func pl(file:NSString) -> AVPlayer? {

    let url = URL(string: file as String)
    let avPlayer: AVPlayer?
    let playerItem = AVPlayerItem(url: url!)
    avPlayer = AVPlayer(playerItem:playerItem)



    if avPlayer?.rate == 0 {
        avPlayer?.play()
        avPlayer?.rate = 1.0

    } else if avPlayer?.rate == 1{

        avPlayer?.pause()

    }

    return avPlayer

}

表格 View 单元格:

class TableViewCellAudioList: UITableViewCell {

@IBOutlet weak var number: UILabel!
@IBOutlet weak var name: UILabel!
@IBOutlet weak var duration: UILabel!
@IBOutlet weak var playChange: UIButton!



var tapAction: ((UITableViewCell) -> Void)?
@IBAction func playAudio(_ sender: Any) {
    tapAction?(self) 
  }    
}

编辑:

enter image description here

最佳答案

我想速度变慢的问题在于您以相同的点击方法开始播放。在创建 AVAudioPlayer 实例之前,您在内存中读取了整个文件。这很慢,而且很可能是您减速的原因。

  1. 您不需要将文件加载到内存中,您可以从文件中播放它 - docs .我不是 100% 确定 AVAudioPlayer 如何在内部工作,但它可能会减少你的减速。

  2. 为了消除减速,您可以在单独的线程中开始播放,或者尝试使用 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1/*seconds* 从当前运行循环周期推迟播放/, execute: {。这应该允许 UIKit 完成所有重绘操作,你应该得到快速的改变。 之后调度可能是快速和肮脏的解决方案,但你需要实际测量多少通过开始播放并决定是否可以将其保留在主线程中来减少减速。

编辑:在评论中讨论并意识到您不是从磁盘而是从互联网加载文件。

你可能想看看 AVPlayer 而不是 AVAudioPlayer。您的问题是您从互联网加载整个文件,这在主线程中非常很慢。 AVPlayer 允许通过“流”播放远程文件。有了它,您就不必等待整个文件下载完毕。

另一种选择是预下载您的文件,但这超出了本题的范围。

关于ios - 在 TableView 中更改图像按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44647148/

相关文章:

ios - 这里是 iOS SDK。 map 未加载

swift - 在 ViewController 中为 UITableView 编辑和添加按钮

ios - UITableView 中的 UIPickerView 对单元格下半部分的触摸没有反应

ios - 以外语显示 JSON 文本

ios - 强制一个 View Controller 只有横向

ios - 将模型对象的引用存储在其中表示的 UITableViewCell 中是否正确?

ios - UITextField 文本在通过委托(delegate)方法设置时不出现

Swift Firebase 4.0-observeSingleEvent 不返回数据集(但身份验证正在工作)

ios - 如何更改重复单元格中点击的按钮图像?

iphone - gzipInflate/gzipDeflate 错误