ios音乐播放器-仿QQ音乐

小编 2026-06-24 阅读:1936 评论:0
非常感谢大家利用自己宝贵的时间来阅读我的文章 ,  这篇文章主要写一个iOS系统下的音乐播放器 , 包括简单的仿QQ音乐播放器界面、音乐播放、歌词解析、后台控制等  ,如果你正好需要 , 希望你看完后能够...

非常感谢大家利用自己宝贵的时间来阅读我的文章 ,  这篇文章主要写一个iOS系统下的音乐播放器 , 包括简单的仿QQ音乐播放器界面、音乐播放、歌词解析、后台控制等  ,如果你正好需要 , 希望你看完后能够对你的提升有所帮助 , 当然,阅读中如果发现什么错误和可优化的地方 , 希望可以得到你的指点 , 有任何不妥的地方 欢迎指正。喜欢的可以关注下我的简书我的博客

老套路,先上截图和demo

 

下面说一下实现步骤吧

一、界面搭建

因为主要是为了练手音乐播放相关功能,所以界面写的比较简单,一个主界面加一个侧滑菜单,列表界面就不说了,说一个侧滑菜单和播放界面吧,侧滑菜单我这里使用的是PKRevealController,使用方法:把demo里的PKRevealController文件夹拖进你的项目里,在AppDelegate导入头文件,主要代码如下:

@property (nonatomic,strong)PKRevealController *revealVc;

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

ZQNavigationController *nav = [[ZQNavigationController alloc] initWithRootViewController:[[ZQMusiListController alloc] init]];

ZQMusicMenuController *leftVC =  [[ZQMusicMenuController alloc]

init];

self.revealVc = [PKRevealController revealControllerWithFrontViewController:nav leftViewController:leftVC options:nil];

self.revealVc.animationDuration = 0.25;

self.window.rootViewController = self.revealVc;

这里的ZQMusicMenuController为主页面控制器,ZQMusicMenuController为侧滑菜单控制器

这样就能实现右滑弹出菜单了,手动控制菜单滑出的代码如下:

#pragma mark --菜单栏滑出/隐藏

- (void)menuBtnClick

{

[self.navigationController.revealController showViewController:self.navigationController.revealController.leftViewController];

}

下面说一下播放页的界面构造,最下层是背景图片,这里需要做一个毛玻璃的效果,第二层为歌曲信息展示和播放控制按钮,第三层是用两个scrollView实现的歌词界面,具体可以自己看看demo里的ZQMusicShowView,还有个旋转动画的效果什么的,具体代码在这里就不贴了,挺占地的,自己看看demo吧,注释写的挺详细

二、音乐播放

这里主要用到三个工具类

1、ZQMusicTool :用来获取所有歌曲、当前播放歌曲、上一首、下一首,主要方法有

+(instancetype)shareMusicTool;

// 获取所有音乐

-(NSArray *)Musics;

// 当前正在播放的音乐

-(ZQMusicModel *)playingMusic;

// 设置默认播放的音乐

-(void)setUpPlayingMusic:(ZQMusicModel *)playingMusic;

// 返回上一首音乐

- (ZQMusicModel *)previousMusic;

// 返回下一首音乐

- (ZQMusicModel *)nextMusic;

2、ZQPlayerTool :用来控制音乐的启停、进度、切换,主要方法有

/// 播放

/// @param name 歌曲名称

-(void)playMusicWithMusicName:(NSString *)name;

/// 暂停

-(void)pause;

/// 歌曲总时长字符串

-(NSString *)durationMusicString;

/// 总时长

-(NSTimeInterval)durationMusic;

/// 当前播放时长

-(NSString *)currentTimeString;

/// 当前时长

-(NSTimeInterval)currentTime;

/// 进度

-(CGFloat)musicProgress;

/**

是否正在播放

*/

- (BOOL)isplaying;

/**

下一首

*/

- (void)nextMusic;

/**

上一首

*/

- (void)previousMusic;

3、ZQLyricTool :用来解析歌词(这里只做了lrc格式解析),主要方法有

+(NSArray *)lyricListWithName:(NSString *)name;

具体的使用方法参考demo

三、锁屏播放

锁屏效果包括:锁屏歌曲信息和远程控制音乐播放,首先满足后台播放音乐的条件,具体步骤参考下图

在音乐播放工具类初始化的时候添加下面代码

AVAudioSession *session = [AVAudioSession sharedInstance];

[session setActive:YES error:nil];

[session setCategory:AVAudioSessionCategoryPlayback error:nil];

下面实现锁屏歌曲信息展示,我是在程序进入后台的时候如果还在播放音乐就创建一个NSTimer用来刷新锁屏歌曲信息,具体代码如下:

进入后台

- (void)applicationEnterBackground

{

if ([[ZQPlayerTool sharePlayerTool] isplaying]) {

self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0/30.0 target:self selector:@selector(updateScreenMusicInfo) userInfo:nil repeats:YES];

[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];

}

}

-(void)updateScreenMusicInfo {

MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter];

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

ZQMusicModel *music = [[ZQMusicTool shareMusicTool] playingMusic];

//初始化  给他 专辑图片  播放时间进度

//歌手名称

dict[MPMediaItemPropertyAlbumTitle]= music.zhuanji;

dict[MPMediaItemPropertyArtist]= music.singer;

dict[MPMediaItemPropertyTitle]= music.name;

//设置当前时间

dict[MPNowPlayingInfoPropertyElapsedPlaybackTime]=@([[ZQPlayerTool sharePlayerTool] currentTime]);

//总时间

dict[MPMediaItemPropertyPlaybackDuration]= @([[ZQPlayerTool sharePlayerTool] durationMusic]);

// 开启上下文

CGRect rect = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width - 20, [UIScreen mainScreen].bounds.size.width - 20);

UIGraphicsBeginImageContextWithOptions(rect.size, YES, [UIScreen mainScreen].scale);

UIImage *sourceImage = [UIImage imageNamed:music.image];

[sourceImage drawInRect:rect];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

dict[MPMediaItemPropertyArtwork] = [[MPMediaItemArtwork alloc]initWithImage:newImage];

infoCenter.nowPlayingInfo = dict;

}

回到前台

- (void)applicationBecomeActive

{

[self.timer invalidate];

self.timer = nil;

}

下面就剩下远程控制音乐播放了

#pragma mark -- 响应锁屏点击

-(void)remoteControlReceivedWithEvent:(UIEvent *)event {

switch (event.subtype) {

case UIEventSubtypeRemoteControlPlay:

{

ZQMusicModel *music = [[ZQMusicTool shareMusicTool] playingMusic];

[[ZQPlayerTool sharePlayerTool] playMusicWithMusicName:music.mp3];

}

break;

case UIEventSubtypeRemoteControlPause:

[[ZQPlayerTool sharePlayerTool] pause];

break;

case UIEventSubtypeRemoteControlPreviousTrack:

{

ZQMusicModel *model = [[ZQMusicTool shareMusicTool] previousMusic];

[[ZQMusicTool shareMusicTool] setUpPlayingMusic:model];

[[ZQPlayerTool sharePlayerTool] playMusicWithMusicName:model.mp3];

}

break;

case UIEventSubtypeRemoteControlNextTrack:

{

[[ZQPlayerTool sharePlayerTool] nextMusic];

}

break;

default:

break;

}

}

到这里一个简单的音乐播放器就完成了,不怎么会讲解,具体实现还是看demo吧,如果有什么疑问或者发现什么不足,欢迎指正。如果有时间的话后续会添加些动画效果和细节修改,最后的最后,别忘了点赞收藏

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表