一.歌词的展示 -- 首先歌词是在scrollView上,scrollView的大小是两个屏幕的宽度

  • 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 = ; i < self.lrcList.count; i++) {
    // 当前的歌词
    ChaosLrc *lrc = self.lrcList[i];
    NSInteger next = i + ;
    // 下一句歌词
    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:];
    NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:self.currentLrcIndex inSection:];
    // 记录当前行
    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:];
    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(, , self.bounds.size.width * self.progress, self.bounds.size.height);
    // 2.选择颜色
    [[UIColor yellowColor] set];
    // 3.添加区域开始画图
    // UIRectFill(fillRect);
    UIRectFillUsingBlendMode(fillRect, kCGBlendModeSourceIn);
    } @end
  • 外部进度值的计算

iOS开发--QQ音乐练习,歌词的展示,歌词的滚动,歌词的颜色变化的更多相关文章

  1. iOS开发--QQ音乐练习,后台播放和锁屏界面

    一.设置后台播放 首先允许程序后台播放 代码实现 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOpti ...

  2. iOS开发--QQ音乐练习,旋转动画的实现,音乐工具类的封装,定时器的使用技巧,SliderBar的事件处理

    一.旋转动画的实现 二.音乐工具类的封装 -- 返回所有歌曲,返回当前播放歌曲,设置当前播放歌曲,返回下一首歌曲,返回上一首歌曲方法的实现 头文件 .m文件 #import "ChaosMu ...

  3. 10、 在QQ音乐中爬取某首歌曲的歌词

        需求就是把关卡内的代码稍作修改,将周杰伦前五页歌曲的歌词都爬取下来,结果就是全部展示打印出来.       URL  https://y.qq.com/portal/search.html#p ...

  4. iOS开发 QQ粘性动画效果

    QQ(iOS)客户端的粘性动画效果 时间 2016-02-17 16:50:00  博客园精华区 原文  http://www.cnblogs.com/ziyi--caolu/p/5195615.ht ...

  5. IOS 开发qq登陆界面

    // //  ViewController.m //  QQUI_bydfg // //  Created by Kevin_dfg on 16/4/15. //  Copyright © 2016年 ...

  6. iOS开发QQ空间半透明效果的实现

    //1.首先我们可以确定的是cell的半透明, /* white The grayscale value of the color object, specified as a value from ...

  7. iOS开发所有KeyboardType与图片对应展示

    1.UIKeyboardTypeAlphabet 2.UIKeyboardTypeASCIICapable 3.UIKeyboardTypeDecimalPad  4.UIKeyboardTypeDe ...

  8. iOS开发-- 如何让 UITableView 的 headerView跟随 cell一起滚动

    在我们利用 UITableView 展示我们的内容的时候,我需要在顶部放一个不同于一般的cell的 界面,这个界面比较独特. 1. 所以我就把它 作为一个section的 headerView. 也就 ...

  9. iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)

    新建一个Category,命名为UIColor+Hex,表示UIColor支持十六进制Hex颜色设置. UIColor+Hex.h文件, #import <UIKit/UIKit.h> # ...

随机推荐

  1. WPF使用后台C#代码创建Grid

    笔者刚刚接触WPF,菜鸟一枚,在做一个练手程序时遇到这样一个需求,创建一个新的Grid并将其添加至一个ListView中,要求Grid及其子元素应按一定顺序给Name属性赋值,直接使用XAML创建的话 ...

  2. 希尔排序(c++)

    希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. 希尔排序是把记 ...

  3. pitch yaw roll 的区别

    http://blog.163.com/vipwdp@126/blog/static/150224366201281935518196/

  4. Unity3D中的预制件(Prefab)的创建和使用说明!!!

    首先我说明一下什么预制件? 在U3D里面我们叫它Prefab:我们可以这样理解:当制作好了游戏组件(场景中的任意一个gameobject),我们希望将它制作成一个组件模版,用于批量的套用工作,例如说场 ...

  5. linux运维中的命令梳理(四)

    ----------管理命令---------- ps命令:查看进程 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不 ...

  6. sublime和python--path

    配置Sublime Text 2 的Python运行环境 (2013-09-11 11:36:17) 转载▼ 标签: python 分类: 科技相关     Sublime Text 2作为一款轻量级 ...

  7. Swift中的Masonry第三方库——SnapKit

    在OC开发时我常用一个名叫Masonry的第三方Autolayout库,在转Swift后发现虽然Swift可以混编OC,但总感觉有些麻烦,在Github上发现了这个叫做SnapKit的第三方库,发现使 ...

  8. notes:spm多重比较校正

    SPM做完统计后,statistical table中的FDRc实际上是在该p-uncorrected下,可以令FDR-correcred p<=0.05的最小cluster中的voxel数目: ...

  9. web—第三章XHTML

     web—第三章XHTML 又是一周 我们学的了做表单:一开始我以为表单是表格.但结果:表单是以采集和提交用户输入数据的,这样讲很迷,说简单点就是登陆端.比如:Facebook.twitter.Ins ...

  10. TinyFrame升级之一:框架概览

    由于之前的TinyFrame多于简单,并且只是说明原理,并无成型的框架出来,所以这次我把之前的知识进行了汇总,然后做出了这一版的TinyFrame框架. 整个框架的结构如下: TinyFrame.Da ...