iOS之基于FreeStreamer的简单音乐播放器示例

2020-01-21 02:24:13于海丽

在歌词模型准备好之后,我们要展示歌词,这里我选择的是tableview,通过每一个cell来加载不同的歌词,然后通过歌词的时间信息来更新和滚动


#pragma mark == UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return [GLMusicPlayer defaultPlayer].musicLRCArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  MusicLRCTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"musicLrc" forIndexPath:indexPath];
  cell.selectionStyle = UITableViewCellSelectionStyleNone;
  cell.backgroundColor = [UIColor clearColor];
  cell.contentView.backgroundColor = [UIColor clearColor];
  
  cell.lrcModel = [GLMusicPlayer defaultPlayer].musicLRCArray[indexPath.row];
  
  if (indexPath.row == self.currentLcrIndex) {
    [cell reloadCellForSelect:YES];
  }else{
    [cell reloadCellForSelect:NO];
  }
  
  return cell;
}

这里面唯一比较麻烦的可能就是更新歌词了,在上面的定时器中,我们也通过代理来更新了进度条,所以我也将更新歌词的部分放在了代理中,这样可以达到实时更新的目的,下面看看方法


//逐行更新歌词
- (void)updateMusicLrcForRowWithCurrentTime:(NSTimeInterval)currentTime
{
  for (int i = 0; i < [GLMusicPlayer defaultPlayer].musicLRCArray.count; i ++) {
    GLMusicLRCModel *model = [GLMusicPlayer defaultPlayer].musicLRCArray[i];
    
    NSInteger next = i + 1;
    
    GLMusicLRCModel *nextLrcModel = nil;
    if (next < [GLMusicPlayer defaultPlayer].musicLRCArray.count) {
      nextLrcModel = [GLMusicPlayer defaultPlayer].musicLRCArray[next];
    }
    
    if (self.currentLcrIndex != i && currentTime >= model.time)
    {
      BOOL show = NO;
      if (nextLrcModel) {
        if (currentTime < nextLrcModel.time) {
          show = YES;
        }
      }else{
        show = YES;
      }
      
      if (show) {
        NSIndexPath *currentIndexPath = [NSIndexPath indexPathForRow:i inSection:0];
        NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:self.currentLcrIndex inSection:0];
        
        self.currentLcrIndex = i;
        
        MusicLRCTableViewCell *currentCell = [self.lrcTableView cellForRowAtIndexPath:currentIndexPath];
        MusicLRCTableViewCell *previousCell = [self.lrcTableView cellForRowAtIndexPath:previousIndexPath];
        
        //设置当前行的状态
        [currentCell reloadCellForSelect:YES];
        //取消上一行的选中状态
        [previousCell reloadCellForSelect:NO];
  
  
        if (!self.isDrag) {
          [self.lrcTableView scrollToRowAtIndexPath:currentIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
        }
      }
    }
    
    if (self.currentLcrIndex == i) {
      MusicLRCTableViewCell *cell = [self.lrcTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
      
      CGFloat totalTime = 0;
      if (nextLrcModel) {
        totalTime = nextLrcModel.time - model.time;
      }else{
        totalTime = [GLMusicPlayer defaultPlayer].duration.minute * 60 + [GLMusicPlayer defaultPlayer].duration.second - model.time;
      }
      CGFloat progressTime = currentTime - model.time;
      cell.lrcLable.progress = progressTime / totalTime;
    }
  }
}