Вот проигрыватель Musi c, в котором есть UIView (гистограмма анимации) в каждой верхней части ячейки tableView (для отображения текущей воспроизводимой песни). Пожалуйста, обратитесь к скриншоту ниже.
/ / / / В 3-й строке это гистограмма анимации в верхней части обложки песни, показывающая текущую воспроизводимую песню , И что я хочу сделать, это позволить этой гистограмме анимации перейти к следующей песне, когда песня заканчивается sh.
В настоящее время я использую audioPlayerDidFinishPlaying()
, чтобы вызвать изменения информации о воспроизведении, когда песня фини sh играет. А внутри tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
для установки состояния анимационного изображения в ячейке.
/ / / Мой код, как показано ниже:
- VC2 (воспроизводимая сцена)
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
// Code to change the playing info & track
if SongData.repeatSequence == "repeatOne" {
AudioManager.sharedInstance.playTrack(idx: SongData.currentTrack, songList: SongData.songList)
songTitle.text = SongData.songList[SongData.currentTrack].songName
songAlbum.text = SongData.songList[SongData.currentTrack].artistName + " - " + SongData.songList[SongData.currentTrack].albumName
songArtwork.image = SongData.songList[SongData.currentTrack].albumArtwork
} else if SongData.repeatSequence == "repeatList" {
// print("play current song done!")
SongData.currentTrack = (SongData.currentTrack + 1) % (SongData.songList.count)
AudioManager.sharedInstance.playTrack(idx: SongData.currentTrack, songList: SongData.songList)
songTitle.text = SongData.songList[SongData.currentTrack].songName
songAlbum.text = SongData.songList[SongData.currentTrack].artistName + " - " + SongData.songList[SongData.currentTrack].albumName
songArtwork.image = SongData.songList[SongData.currentTrack].albumArtwork
} else if SongData.repeatSequence == "shuffle" {
SongData.currentTrack = Int.random(in: 0 ..< SongData.shuffleSongList.count)
// SongData.currentTrack = (SongData.currentTrack + 1) % (SongData.songList.count)
// print("SongData.songList.count", SongData.songList.count)
AudioManager.sharedInstance.playTrack(idx: SongData.currentTrack, songList: SongData.shuffleSongList)
songTitle.text = SongData.shuffleSongList[SongData.currentTrack].songName
songAlbum.text = SongData.shuffleSongList[SongData.currentTrack].artistName + " - " + SongData.shuffleSongList[SongData.currentTrack].albumName
songArtwork.image = SongData.shuffleSongList[SongData.currentTrack].albumArtwork
// get index (songList) where the same song in songList from song on shuffleSongList
NowPlayingViewController.indexFromShuffleList = SongData.songList.firstIndex(where: {$0.songName == songTitle.text}) ?? 0
// print("=========Shuffle Track=========", NowPlayingViewController.indexFromShuffleList)
if NowPlayingViewController.indexFromShuffleList >= 0 {
SongData.currentTrack = NowPlayingViewController.indexFromShuffleList
NowPlayingViewController.indexFromShuffleList = -1
}
}
// check if song playing is finished
AudioManager.sharedInstance.audioPlayer.delegate = self
// SongsTableViewController().tableView.reloadData()
print("Audio did finish playing")
updateLockedScreenPlayingInfo()
}
- VC1 (SongsTableViewController) та же сцена, что и на скриншоте выше, я настраиваю анимационное изображение следующим образом
cell.config(forState: SongData.isPlaying ? .playing : .paused)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
if resultSearchController.isActive {
cell.addButton.tag = indexPath.row
cell.songTitle.text = filteredTableData[indexPath.row].songName
cell.songArtist.text = filteredTableData[indexPath.row].artistName
cell.songArtwork.image = filteredTableData[indexPath.row].albumArtwork
// set dynamic view on albumArtwork
if SongData.songList.count == 0 {
cell.config(forState: .nonState)
} else {
if filteredTableData[indexPath.row].songName == SongData.songList[SongData.currentTrack].songName {
cell.config(forState: SongData.isPlaying ? .playing : .paused)
} else {
cell.config(forState: .nonState)
}
}
} else {
cell.addButton.tag = indexPath.row
cell.songTitle.text = tableData[indexPath.row].songName
cell.songArtist.text = tableData[indexPath.row].artistName
cell.songArtwork.image = tableData[indexPath.row].albumArtwork
// return cell
// set dynamic view on albumArtwork
if SongData.songList.count == 0 {
cell.config(forState: .nonState)
} else {
if tableData[indexPath.row].songName == SongData.songList[SongData.currentTrack].songName {
print("tableData, songName", tableData[indexPath.row].songName)
cell.config(forState: SongData.isPlaying ? .playing : .paused)
} else {
// print("no name matches")
cell.config(forState: .nonState)
}
}
}
return cell
}
/ / / * Проблема заключается в том, что после воспроизведения текущей песни анимационное изображение не перемещается к следующему , но если изменить его на другой V C и обратно, анимационное изображение было изменено на правильное. Согласно моему исследованию, это потому, что нам нужно перезагрузить данные tableView VC2 в audioPlayerDidFinishPlaying
, а затем поставить SongsTableViewController().tableView.reloadData()
в конце audioPlayerDidFinishPlaying
. Но это не работает, нужна помощь здесь о том, как перезагрузить данные VC2 из VC1 или есть ли другое решение для этого?