iOS歌词解析

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];

至此,整个思路就完成了,中间肯定有很多的细节问题需要处理,由于暂时没想好怎么去说这些细节的东西,留待以后如果有思路再补充.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值