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;
}}
【ios音乐播放器-仿QQ音乐】 到这里一个简单的音乐播放器就完成了,不怎么会讲解,具体实现还是看demo吧,如果有什么疑问或者发现什么不足,欢迎指正。如果有时间的话后续会添加些动画效果和细节修改,最后的最后,别忘了点赞收藏
推荐阅读
- 2020-04-07vue中Axios的封装和API接口的管理
- iOS中的Block
- 病态与非病态的梦中人情结|病态与非病态的梦中人情结 - 草稿
- 夏天了,来一首入耳即化的音乐吧
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 2019-08-29|2019-08-29 iOS13适配那点事
- Hacking|Hacking with iOS: SwiftUI Edition - SnowSeeker 项目(一)
- iOS面试题--基础
- 接口|axios接口报错-参数类型错误解决
- iOS|iOS 笔记之_时间戳 + DES 加密