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吧,如果有什么疑问或者发现什么不足,欢迎指正。如果有时间的话后续会添加些动画效果和细节修改,最后的最后,别忘了点赞收藏😂

参考链接:

iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果

iOS音乐播放器开发(一)-思路与设计

iOS镂空文字、类歌词进度显示文字

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容