自己编写的音乐播放器偶然用到这个模块,发现没有思路,而且上网搜了搜,关于这方面的文章不是很多,没找到满意的结果,然后自己也是想了想,最终实现了这种效果,想通了发现其实很简单。

直接上原理:

第一种:

原理就是创建一个UILabel,设置一下UILabel的lineBreakMode属性为NSLineBreakByClipping(这样的话就是的内容过多的话就会不显示,所以UILabel的宽度设置成0,就会不显示内容,然后用定时器不断更改宽度,内容也就会不断地显示出来,覆盖掉原本的内容,字体颜色要设成颜色不一样的,默认都是黑色,所以要改个其他的颜色,不然的话效果就看不出来了),位置大小和内容文本的位置一样,高度也一样,就会给人一种卡拉OK的效果。

在我的这个作品中效果不是很好,因为我用的是UIPickerView来显示歌词的,UILabel的字体就要和UIPickerView的文本字体一样,所以就有点难度,当然了,如果你要覆盖的字体可以自定义字体大小的话那就另当别论了,所以我还有一种方法。

第二种:

这种方法和第一种差不多,因为我采用的是UIPickerView来显示的歌词(当前显示歌词的高度为60),所以用第一种效果不是很好,所以我直接定义两个一模一样的UILabel,一个底部的UILabel宽度和屏幕一样宽,但是内容是居中的,然后就是顶部的UILabel,首先设置字体和底部的字体一样大,接着设置UILabel的内容和底部的内容一样,起始位置就是x就是屏幕宽的一半减去根据字体得到宽度的一半,y就是屏幕的高的二分之一减去30,高为60,宽为0,因为宽是要不断增加的,这样才能有卡拉OK的效果。

总结一下:第一种方法是只有一个UILabel,直接覆盖到原文本上,如果原文本字体可以自己设置的话就足够了,第二种则是比较强大的,就相当于先定义一个把原来的覆盖掉,然后在接着覆盖。

下面我说一下核心的代码片段(篇未有源码下载地址):

因为采用的是UIPickerView,所以显示歌词需要判断一下,下面的这个方法不只是每显示一行调用一次,所以要判断一下

//根据字体大小来设置高度或宽度

-(CGRect)boundingRectWithInitSize:(CGSize)size

{

self.jianbian.lineBreakMode=NSLineBreakByClipping;

CGRect rect=[self.jianbian.text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObjectsAndKeys:self.jianbian.font,NSFontAttributeName, nil] context:nil];

return rect;

}

//显示歌词

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

{

_jishu++;

//根据字体调整frame的大小

CGRect myRect;

myRect=[self boundingRectWithInitSize:CGSizeMake(0, 60)];

//设置底部的UILabel的大小和起始位置

self.jianbiant.frame=CGRectMake(Kuan, (Gao-20)/12.0*5-30,Kuan, 60);

//设置顶部的UILabel的大小和起始位置

self.jianbian.frame=CGRectMake(Kuan+Kuan/2-myRect.size.width/2, (Gao-20)/12.0*5-30,0, 60);

//因为UIPickerView比较特殊,所以需要判断当前正在显示的内容,把需要显示的内容设置成底部和顶部UILabel的内容

if (_jishu==2 && row<((NSArray*)self.geCiShuZu[_diJiGe]).count-1) {

_jianbiant.text=self.geCiShuZu[_diJiGe][row][@"lyric"];

_jianbian.text=_jianbiant.text;

_kuan=myRect.size.width;

_jishu=0;

}

if (_jishu==1 && row==((NSArray*)self.geCiShuZu[_diJiGe]).count-1)

{

if (_hehe)

{

_jianbiant.text=self.geCiShuZu[_diJiGe][row][@"lyric"];

_jianbian.text=_jianbiant.text;

_kuan=myRect.size.width;

_jishu=0;

_hehe=NO;

}

_hehe=YES;

}

_zongkuan=0;

return self.geCiShuZu[_diJiGe][row][@"lyric"];

}

下面是运行时的图片:

    

源码有好几个文件,所以我打包了有兴趣的可以下载一下(这个也是可以快进快退的进度条和歌曲还有歌词全部同步,左滑显示歌词,上下滑动歌词歌曲会同步,进度条也会同步,同样的左右滑动进度条歌的进度和歌词的进度也会改变):

http://download.csdn.net/detail/yz18337161090/9457997

转载于:https://www.cnblogs.com/BK-12345/p/5260907.html

卡拉OK效果的实现-iOS音乐播放器相关推荐

  1. ios音乐播放器-仿QQ音乐

    这篇文章主要写一个iOS系统下的音乐播放器 , 包括简单的仿QQ音乐播放器界面.音乐播放.歌词解析.后台控制等  ,如果你正好需要 , 希望你看完后能够对你的提升有所帮助 , 当然,阅读中如果发现什么 ...

  2. 基于IOS音乐播放器在线歌词同步小程序系统(音乐小程序)

    目 录 目 录 1 摘 要 3 Abstract 4 1 导论 6 1.1 背景问题 6 1.2 选题意义 6 1.3 本文内容 7 2 核心功能 9 2.1 功能调研 9 2.2 可行性分析 12 ...

  3. android+仿ios+音乐播放器,iOS简单的音乐播放器(仿QQ音乐)

    AVPlayer实现基本的播放,暂停,上一首,下一首,调节音量,调节进度等,正在学习的新人可以看下,有什么不足可以互相学习,谢谢支持 qq音乐.gif 这个是我写的一个简单的低仿QQ音乐, 如果你也喜 ...

  4. iOS音乐播放器小技巧

    在没有网络的情况下,音频的后台播放比较简单,google一下可以搜到很多资料,但是如果每次歌曲的请求都是通过网络,就不成了,有时可以也扛不了几首,这里总结下实现方法,可以实现像电台一样的功能,后台播放 ...

  5. iOS音乐播放器的后台播放和远程控制

    iOS的后台任务一直有很严格的限制,一般情况下只有几类情况能使用后台任务,下面介绍其中的一种 音乐的后台播放. 1.要支持后台任务,首先你得告诉系统你需要后台任务,所以你首先在Info.plist文件 ...

  6. iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码...

    iOS精选源码 iOS WKWebView的使用源码 模仿apple music 小播放器的交互实现 高仿微信的悬浮小窗口 iOS仿支付宝首页效果 [swift]仿微信悬浮窗 类似于今日头条,网易新闻 ...

  7. android音乐播放器完整教程,android实现简单音乐播放器

    本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...

  8. android在线音乐播放器教程,android实现简单音乐播放器

    本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...

  9. 微信小程序入门-音乐播放器

    萌新,随便做做,只是了解一下微信小程序,希望可以给看到的胖友一点参考. 之前在网上看到这个人入门四天做完一个,我五天做完了,比他好看,突然有一点自信 然后发现自己特别不乐意重新看自己的代码,总觉得写的 ...

最新文章

  1. 两个整形变量,不用中间变量进行替换!
  2. 括号匹配编码c语言,用c语言实现括号匹配算法
  3. 华为路由器 android,华为智能路由器亮相 Android系统很强大
  4. 电脑记时----千年虫
  5. morningcat2018 LearningDocs
  6. ]remove-duplicates-from-sorted-list-ii (删除)
  7. linux centos/redhat mysql8.0安装(汇总贴)
  8. 包r语言_R语言入门之寻找你的R包
  9. python pandas 处理相同标题的csv文件_Python使用pandas处理CSV文件的实例讲解
  10. 面向对面 静态参数 与 组合
  11. mysql 查询大于某个时间_有关于mysql 时间作为条件查询,索引失效的问题。
  12. UIScrollView 手势缩放
  13. 安装deepin后会删除win10吗_不管是先装Win10还是先装Deepin,启动问题轻松搞定
  14. App_Data 目录中的数据库位置指定了一个本地 SQL Server
  15. 洛谷 P1948 [USACO08JAN]电话线Telephone Lines
  16. JS纯前端导出PDF及分页和使用window.print()保存PDF
  17. centos下安装teamview
  18. windows10序列号即将过期解决办法
  19. 如何下载国外硕博论文?
  20. JMF环境配置(Eclipse)

热门文章

  1. Linux下Mysql的基本操作
  2. 图像处理之简单脸谱检测算法
  3. My97 DatePicker日历控件在火狐或IE下打不开
  4. ci框架——辅助函数
  5. Java之定时任务详解
  6. OC之NSArray/NSMutableArrray
  7. rocksdb和leveldb性能比较——写性能
  8. 从系统的启动过程分析,为什么我们划分分区的时候 /sbin 、/bin、/lib、/dev不能做为独立的分区?...
  9. 读写锁ReadWriteLock
  10. TCP三次握手及四次挥手详细图解