iOS开发--QQ音乐练习,歌词的展示,歌词的滚动,歌词的颜色变化
2016-06-14 00:18
836 查看
一.歌词的展示 -- 首先歌词是在scrollView上,scrollView的大小是两个屏幕的宽度
scrollView滚动修改透明度的代码
自定义展示歌词的view,继承自UIScrollView,向外界提供一个歌词文件名的属性
/** 歌词文件的名字 */
@property(nonatomic,copy) NSString *lrcFileName;
重写setter,解析歌词,通过歌词的工具类获得模型集合
歌词工具类的实现
歌词解析完毕后,根据歌词模型集合来实现tableView(歌词用tableView来显示)的数据源方法
二.歌词的滚动
歌词的滚动由每一句的时间来决定,自定义的歌词的view需要外界不停的提供歌曲播放的时间,自己来判断并滚动显示对应的歌词.所以自定义的歌词View需要向外界提供一个时间属性,重写时间属性来实现歌词滚动
外界给歌词的View提供时间就不是每一秒提供一次那么简单了,外界需要更牛逼的定时器
播放的时候添加定时器
定时器的方法中实现给歌词的view提供的时间属性赋值
三.歌词的颜色变化 -- 画上去的(自定义cell中的显示歌词的label,label需要外界提供一个进度值,自己内部根据进度值来画)
自定义label的实现
外部进度值的计算
scrollView滚动修改透明度的代码
自定义展示歌词的view,继承自UIScrollView,向外界提供一个歌词文件名的属性
/** 歌词文件的名字 */
@property(nonatomic,copy) NSString *lrcFileName;
重写setter,解析歌词,通过歌词的工具类获得模型集合
歌词工具类的实现
#import "ChaosLrcTool.h" #import "ChaosLrc.h" @implementation ChaosLrcTool + (NSArray *)lrcToolWithLrcName:(NSString *)lrcname { // 1.获取文件路径 NSString *lrcPath = [[NSBundle mainBundle] pathForResource:lrcname ofType:nil]; // 2.加载文件内容 NSString *lrcString = [NSString stringWithContentsOfFile:lrcPath encoding:NSUTF8StringEncoding error:nil]; // 3.切割字符串 NSArray *lrcLines = [lrcString componentsSeparatedByString:@"\n"]; // 4.遍历集合,转换成歌词模型 NSMutableArray *arr = [NSMutableArray array]; for (NSString *lrcLineString in lrcLines) { /* [ti:简单爱] [ar:周杰伦] [al:范特西] */ // 5.跳过指定行 if ([lrcLineString hasPrefix:@"[ti"] || [lrcLineString hasPrefix:@"[ar"] || [lrcLineString hasPrefix:@"[al"] || ![lrcLineString hasPrefix:@"["]) { continue; } ChaosLrc *lrc = [ChaosLrc lrcWithLrcLine:lrcLineString]; [arr addObject:lrc]; } return arr; } @end
歌词解析完毕后,根据歌词模型集合来实现tableView(歌词用tableView来显示)的数据源方法
二.歌词的滚动
歌词的滚动由每一句的时间来决定,自定义的歌词的view需要外界不停的提供歌曲播放的时间,自己来判断并滚动显示对应的歌词.所以自定义的歌词View需要向外界提供一个时间属性,重写时间属性来实现歌词滚动
#pragma mark - 歌词滚动 // 重写time的setter - (void)setCurrentTime:(NSTimeInterval)currentTime { _currentTime = currentTime; // 遍历歌词,找到对应时间应该显示的歌词模型 for (int i = 0; i < self.lrcList.count; i++) { // 当前的歌词 ChaosLrc *lrc = self.lrcList[i]; NSInteger next = i + 1; // 下一句歌词 ChaosLrc *nextLrc; if (next < self.lrcList.count) { nextLrc = self.lrcList[next]; } if (self.currentLrcIndex != i && currentTime >= lrc.time && currentTime < nextLrc.time) { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0]; NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:self.currentLrcIndex inSection:0]; // 记录当前行 self.currentLrcIndex = i; // 满足条件,tableview滚动 [self.lrcView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; // 刷新上一行,字体还原 [self.lrcView reloadRowsAtIndexPaths:@[previousIndexPath] withRowAnimation:UITableViewRowAnimationNone]; // 刷新当前行,字体变大 [self.lrcView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; } // 当前歌词的label的进度 if (self.currentLrcIndex == i) { // 获取当前的cell NSIndexPath *currentIndexPath = [NSIndexPath indexPathForRow:i inSection:0]; ChaosLrcCell *currentCell = [self.lrcView cellForRowAtIndexPath:currentIndexPath]; CGFloat totalTime = nextLrc.time - lrc.time; // 当前歌词总时间 CGFloat progressTime = currentTime - lrc.time; // 当前歌词已经走过了多长时间 currentCell.lrcLabel.progress = progressTime / totalTime; // 主页的label self.mainLabel.text = lrc.text; self.mainLabel.progress = currentCell.lrcLabel.progress; } } }
外界给歌词的View提供时间就不是每一秒提供一次那么简单了,外界需要更牛逼的定时器
播放的时候添加定时器
定时器的方法中实现给歌词的view提供的时间属性赋值
三.歌词的颜色变化 -- 画上去的(自定义cell中的显示歌词的label,label需要外界提供一个进度值,自己内部根据进度值来画)
自定义label的实现
#import "ChaosLabel.h" @implementation ChaosLabel - (void)setProgress:(CGFloat)progress { _progress = progress; // 重绘 [self setNeedsDisplay]; } - (void)drawRect:(CGRect)rect { [super drawRect:rect]; // 1.获取需要画的区域 CGRect fillRect = CGRectMake(0, 0, self.bounds.size.width * self.progress, self.bounds.size.height); // 2.选择颜色 [[UIColor yellowColor] set]; // 3.添加区域开始画图 // UIRectFill(fillRect); UIRectFillUsingBlendMode(fillRect, kCGBlendModeSourceIn); } @end
外部进度值的计算
相关文章推荐
- iOS二维码扫描
- Ios中CRC校验方法
- [一句秒懂]拦截iOS系统导航栏返回按钮事件-三种方法
- xcode7 ios9 iOS中设计模式中委托模式(同一工作空间不同工程)异步调用
- 升级开发者版本的Xcode,iOS,macOS...
- 自定义NavgationBar
- iOS打开系统相册显示中文方法
- ios中json解析出现的null问题
- iOS强制横屏API不起作用
- iOS开发bundle identifier修改不了(解决bundle ID无法修改的问题)
- iOS开发小技巧--定时器的使用技巧
- iOS开发--QQ音乐练习,旋转动画的实现,音乐工具类的封装,定时器的使用技巧,SliderBar的事件处理
- iOS开发小技巧-修改SliderBar指针的样式(牢记这个方法,只能通过代码来修改)
- iOS 设计模式系列:Command – 命令模式
- iOS开发小技巧--实现毛玻璃效果的方法
- iOS开发--音乐文件播放工具类的封装(包含了音效的封装)
- iOS开发,音效的播放简单实现以及音效播放的简单封装
- iOS进阶收藏
- IOS开发多线程 - 多线程的简单介绍
- iOS音频播放、录音、视频播放、拍照、视频录制