iOS歌词解析
之前,写了一个关于莫文蔚的app,因为版权的问题被苹果拒了,然后也再没动,这几天又拿出来看了看,感觉歌词解析这部分挺有意思的,拿出来说一说.
这个是做好的效果

首先,我们来看看歌词都是怎么展示的,下几个音乐类软件看看,能滚动,被选中的歌词高亮,都是这两个特点,所以猜测是用tableview来显示歌词的.拿虾米验证了一下果然是.
然后,我们要弄明白lrc歌词有哪些格式,上网查,或者抓包都可以看到.一般来说lrc歌词有三种格式:



其实还有一种格式, 是像KTV一样的效果, 每个字对应一个时间点, 在这咱们也用不到就不列举了.
明白了上面的两点,我们来看看整体的思路,其实就两点:
1.歌词解析
2.动态显示
那么,咱们继续往下展开.先来看歌词解析
一般情况下,只需要解析一种格式就可以了,但是,问题是这些歌词都是抓的接口,我们所要做的就是把这三种格式都解析出来.这个地方其实涉及到一个思维的问题,如果你一开始就想着怎么把这三种格式都解析出来,恐怕是很困难的.所以我们找一个好上手的,先解析出来一个,然后再去关注另外两种.
附上部分代码
NSArray *array = [contentString componentsSeparatedByString:@"\n"];
for (int i = 0; i < [array count]; i++) {
NSString *lineString = [array objectAtIndex:i];
NSArray *lineArray = [lineString componentsSeparatedByString:@"]"];
if ([lineArray[0] length] > 8) {
NSString *str1 = [lineString substringWithRange:NSMakeRange(3, 1)];
NSString *str2 = [lineString substringWithRange:NSMakeRange(6, 1)];
if ([str1 isEqualToString:@":"] && [str2 isEqualToString:@"."]) {
for (int i = 0; i < lineArray.count - 1; i++) {
NSString *lrcString = [lineArray objectAtIndex:lineArray.count - 1];
//分割区间求歌词时间
NSString *timeString = [self timeToSecond:[[lineArray objectAtIndex:i] substringWithRange:NSMakeRange(1, 5)]];
self.lrcDictionary = [NSMutableDictionary dictionary];
//把时间 和 歌词 加入词典
[self.lrcDictionary setObject:lrcString forKey:timeString];
}
}
}
}
这一步咱们就把歌词解析出来了,放到了一个字典当中.以上还有两个要注意的问题,一是要把时间转换为秒,二是要给解析出来的歌词按照时间排序.
解析歌词的部分就完成了,剩下的任务就是动态显示了,怎么能够让歌词动态显示呢,主要用到下面两个方法:
1.NSTimer
2.被选中的行移动到中间
- (void)selectRowAtIndexPath:(NSIndexPath*)indexPath animated:(BOOL)animated
scrollPosition:(UITableViewScrollPosition)scrollPosition;
在这里注意的是,定义一个NSUInteger,表示当前歌词行数,通过NSTimer每次把NSUInteger传到
selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated
scrollPosition:(UITableViewScrollPosition)scrollPosition
这个方法.
// 使被选中的行移到中间
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:lineNumber inSection:0];
[self.lrcTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle];
至此,整个思路就完成了,中间肯定有很多的细节问题需要处理,由于暂时没想好怎么去说这些细节的东西,留待以后如果有思路再补充.