歌词加载学习笔记

ios收获:ios中break语句的作用是跳过本层的for循环,而continue只是停止执行这一次循环,从而跳出这一次循环。就是继续执行之后的循环罢了。

1、首先从本地解析歌词文件。Lrc歌词文件时间来确定定时播放的数据。

通过

NSString *LRCPath = [[NSBundle mainBundle] pathForResource:[musicArray[musicArrayNumber] name] ofType:@"lrc"];
    NSString *contentStr = [NSString stringWithContentsOfFile:LRCPath encoding:NSUTF8StringEncoding error:nil];
    NSArray *array = [contentStr componentsSeparatedByString:@" "];

来解析数据,首先把所有的歌词文件加载到一个string中,然后通过通过相关的解码,来获得真实的数据,

array使用"/n"换行。从而得到一行数据,将所有的数据加载到一个数组中。

通过for循环遍历所有的数据,从而获得每一个数据来做相关的处理,根据歌词中的"]"字符串来分割相关的数据。

从而将时间和数据分开。然后再将时间根据":"和"."来分割开来,载入先关的数据。time和lrcstr。。。

- (NSString *)substringWithRange:(NSRange)aRange
可以从不规则的字符串中取出自己需要的字符,并且可以通过组装来实现例如时间的解集

 通过这个格式来截取不规则格式的音频的时间。

通过定时器来定时加载歌词,其中通过歌词的长度来判读需要执行的歌词跳转,

//动态显示歌词
-(void)displayLrc:(NSUInteger )timer
{

    for (int i =0 ; i<[timeArray count]; i++) {
        NSArray * array = [timeArray[i] componentsSeparatedByString:@":"];
        NSUInteger currentTime = [array[0] intValue]*60 +[array[1] intValue];
     
        if(i == ([timeArray count]-1))
        {
            NSArray *array1 = [timeArray[timeArray.count-1] componentsSeparatedByString:@":"];
            NSUInteger currentTime1 = [array1[0] intValue]*60 +[array1[1] intValue];
            if (timer>currentTime1) {
            [self updataLRC:i];
                            }
            break;
#warning  这里有一个问题
           
        }else
        {
            //求出第一句的时间点,在第一句显示前的时间内一直加载第一句
            NSArray *array2 = [timeArray[0] componentsSeparatedByString:@":"];
            NSUInteger currentTime2 = [array2[0] intValue] * 60 + [array2[1] intValue];
            if (timer < currentTime2) {

                [self updataLRC:0];
                //                NSLog(@"马上到第一句");
               break;
            }
        NSArray *array3 = [timeArray[i+1] componentsSeparatedByString:@":"];
         NSUInteger currentTime3 = [array3[0] intValue]*60 +[array3[1] intValue];
        if (timer >=currentTime && timer<=currentTime3) {
            [self updataLRC:i];
     break;
        }
    }
    }
}
//更新选中的代码。
-(void)updataLRC:(NSUInteger)lineNumber { lrcLineNum = lineNumber; [centerTableView reloadData]; NSIndexPath *indexPath= [NSIndexPath indexPathForRow:lineNumber inSection:0 ]; NSLog(@"indexPath %@",indexPath); [centerTableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; }

在tableview的datasorce方法中加载判断需要跳转的界面

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    
    if (tags == 0) {
        
        return [timeArray count];
    }
    else if (tags ==1)
    {
        return [timeArray count];
    }
    
    return [timeArray count];
}

tags是绑定的全部变量,来判断点击事件触发的时候加载的是哪一个segment。

从而来返回相关的tableview cell的个数。

在tableview的datasorce方法 来实现动态加载歌词。

 1 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 2 {
 3     static NSString* cellIndentify = @"LRCCell";
 4     UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIndentify];
 5     if (cell ==nil) {
 6         cell  = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentify];
 7     }
 8     if (indexPath.row == lrcLineNum) {
 9 //        cell.textLabel.text = lrcDict[timeArray[indexPath]];
10         cell.textLabel.text = lrcDict[timeArray[indexPath.row]];
11         cell.textLabel.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1.0];
12         cell.textLabel.font = [UIFont systemFontOfSize:15];
13     }else
14     {
15         cell.textLabel.text = lrcDict[timeArray[indexPath.row]];
16         cell.textLabel.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
17         cell.textLabel.font = [UIFont systemFontOfSize:13];
18     }
19     cell.backgroundColor = [UIColor clearColor];
20     return cell;
21 }

第一次写这么长的代码。好高兴。哈哈

纸上得来终觉浅,绝知此事要躬行
原文地址:https://www.cnblogs.com/asheng/p/4372964.html