天天看点

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;

}

}
           

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