ios音乐播放器-仿QQ音乐

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

先上截图和demo
ios音乐播放器-仿QQ音乐
文章图片


ios音乐播放器-仿QQ音乐
文章图片


ios音乐播放器-仿QQ音乐
文章图片


ios音乐播放器-仿QQ音乐
文章图片


ios音乐播放器-仿QQ音乐
文章图片



下面说一下实现步骤吧
一、界面搭建
因为主要是为了练手音乐播放相关功能,所以界面写的比较简单,一个主界面加一个侧滑菜单,列表界面就不说了,说一个侧滑菜单和播放界面吧,侧滑菜单我这里使用的是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
三、锁屏播放
锁屏效果包括:锁屏歌曲信息和远程控制音乐播放,首先满足后台播放音乐的条件,具体步骤参考下图
ios音乐播放器-仿QQ音乐
文章图片
在音乐播放工具类初始化的时候添加下面代码

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; }}





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

    推荐阅读