前一段时间一直在捣鼓做一个网络音乐播放器,已经实现了基本功能,能加载网络上专辑图片、歌曲和歌词,能播放、暂停、上一曲、下一曲,能选歌播放。现在想要加入显示歌词的功能,上网查了一下资料,大家都是用UITableView来显示歌词的,自己试着整一下,下面来分享一下我的成果!
先说一下思路:
1、将歌词中的内容解析出来,时间点和歌词内容要存储到一个存放歌词信息的类中。
2、建立UITableView,一行歌词一行cell(前面解析歌词时可以知道总共有多少行歌词)。
3、根据音乐播放的进度调整显示哪一行,给当前显示的cell添加一个小动画,增强用户体验。
这里为了方便,直接从storyboard拉一个UITableView,再拉一个cell,拉一个label,拉两个button,如图1所示:
图1
这里的cell是自定义cell,label是放到cell中铺满整个cell,因为歌词显示一行一个cell,cell只显示label,这样歌词的行距就一样了。自定义cell要设置identifier,这里设置为lrcCell,如图2所示:
图2
为UITableView新建一个class,名字为SCTableView,这个类封装了歌词解析(歌词格式如图3所示)和歌词显示的方法,其中代码如下:
//
// SCTableView.swift
// playerTest4
//
// Created by 凌 陈 on 7/15/17.
// Copyright © 2017 凌 陈. All rights reserved.
//
import UIKit
class SCTableView: UITableView, UITableViewDelegate , UITableViewDataSource{
var mCurrentSongIndex = 0
var mUpdateTimer : Timer?
var mLRCDictinary : [String : String] = [String : String]()
var mTimeArray : [String] = [String]()
var mIsLRCPrepared : Bool = false
var mLineNumber : Int = -1
var currentCell : SCLrcCell?
var lrcOldCell : SCLrcCell?
var old_Index : Int = 0
var lrcProgress : CGFloat = 0.0{
didSet{
if currentCell != nil {
autoUpdateLrc()
}
}
}
// 设置歌词index,显示哪一行
var Lrc_Index : Int = 0 {
didSet{
if Lrc_Index == oldValue {
return
}
// 滚动到指定index的位置
// 新的indexPath
let indexPath = NSIndexPath(row: Lrc_Index, section: 0 )
self.scrollToRow(at: indexPath as IndexPath, at: .middle, animated: true)
currentCell = self.cellForRow(at: indexPath as IndexPath) as? SCLrcCell
currentCell?.mTitleLable.text