非常感謝大家利用自己寶貴的時(shí)間來閱讀我的文章 , ?這篇文章主要寫一個(gè)iOS系統(tǒng)下的音樂播放器 , 包括簡單的仿QQ音樂播放器界面坤学、音樂播放、歌詞解析报慕、后臺控制等 ?深浮,如果你正好需要 , 希望你看完后能夠?qū)δ愕奶嵘兴鶐椭?, 當(dāng)然,閱讀中如果發(fā)現(xiàn)什么錯誤和可優(yōu)化的地方 , 希望可以得到你的指點(diǎn) , 有任何不妥的地方 歡迎指正卖子。喜歡的可以關(guān)注下我的簡書略号、我的博客
老套路,先上截圖和demo
下面說一下實(shí)現(xiàn)步驟吧
一洋闽、界面搭建
因?yàn)橹饕菫榱司毷忠魳凡シ畔嚓P(guān)功能,所以界面寫的比較簡單突梦,一個(gè)主界面加一個(gè)側(cè)滑菜單诫舅,列表界面就不說了,說一個(gè)側(cè)滑菜單和播放界面吧宫患,側(cè)滑菜單我這里使用的是PKRevealController刊懈,使用方法:把demo里的PKRevealController文件夾拖進(jìn)你的項(xiàng)目里,在AppDelegate導(dǎo)入頭文件娃闲,主要代碼如下:
@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為側(cè)滑菜單控制器
這樣就能實(shí)現(xiàn)右滑彈出菜單了,手動控制菜單滑出的代碼如下:
#pragma mark --菜單欄滑出/隱藏
- (void)menuBtnClick
{
[self.navigationController.revealController showViewController:self.navigationController.revealController.leftViewController];
}
下面說一下播放頁的界面構(gòu)造皇帮,最下層是背景圖片卷哩,這里需要做一個(gè)毛玻璃的效果,第二層為歌曲信息展示和播放控制按鈕属拾,第三層是用兩個(gè)scrollView實(shí)現(xiàn)的歌詞界面将谊,具體可以自己看看demo里的ZQMusicShowView,還有個(gè)旋轉(zhuǎn)動畫的效果什么的渐白,具體代碼在這里就不貼了尊浓,挺占地的,自己看看demo吧纯衍,注釋寫的挺詳細(xì)
二栋齿、音樂播放
這里主要用到三個(gè)工具類
1、ZQMusicTool :用來獲取所有歌曲襟诸、當(dāng)前播放歌曲瓦堵、上一首、下一首励堡,主要方法有
+(instancetype)shareMusicTool;
// 獲取所有音樂
-(NSArray *)Musics;
// 當(dāng)前正在播放的音樂
-(ZQMusicModel *)playingMusic;
// 設(shè)置默認(rèn)播放的音樂
-(void)setUpPlayingMusic:(ZQMusicModel *)playingMusic;
// 返回上一首音樂
- (ZQMusicModel *)previousMusic;
// 返回下一首音樂
- (ZQMusicModel *)nextMusic;
2谷丸、ZQPlayerTool :用來控制音樂的啟停、進(jìn)度应结、切換刨疼,主要方法有
/// 播放
/// @param name 歌曲名稱
-(void)playMusicWithMusicName:(NSString *)name;
/// 暫停
-(void)pause;
/// 歌曲總時(shí)長字符串
-(NSString *)durationMusicString;
/// 總時(shí)長
-(NSTimeInterval)durationMusic;
/// 當(dāng)前播放時(shí)長
-(NSString *)currentTimeString;
/// 當(dāng)前時(shí)長
-(NSTimeInterval)currentTime;
/// 進(jìn)度
-(CGFloat)musicProgress;
/**
是否正在播放
*/
- (BOOL)isplaying;
/**
下一首
*/
- (void)nextMusic;
/**
上一首
*/
- (void)previousMusic;
3泉唁、ZQLyricTool :用來解析歌詞(這里只做了lrc格式解析),主要方法有
+(NSArray *)lyricListWithName:(NSString *)name;
具體的使用方法參考demo
三揩慕、鎖屏播放
鎖屏效果包括:鎖屏歌曲信息和遠(yuǎn)程控制音樂播放亭畜,首先滿足后臺播放音樂的條件,具體步驟參考下圖
在音樂播放工具類初始化的時(shí)候添加下面代碼
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
下面實(shí)現(xiàn)鎖屏歌曲信息展示迎卤,我是在程序進(jìn)入后臺的時(shí)候如果還在播放音樂就創(chuàng)建一個(gè)NSTimer用來刷新鎖屏歌曲信息拴鸵,具體代碼如下:
進(jìn)入后臺
- (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];
//初始化? 給他 專輯圖片? 播放時(shí)間進(jìn)度
//歌手名稱
dict[MPMediaItemPropertyAlbumTitle]= music.zhuanji;
dict[MPMediaItemPropertyArtist]= music.singer;
dict[MPMediaItemPropertyTitle]= music.name;
//設(shè)置當(dāng)前時(shí)間
dict[MPNowPlayingInfoPropertyElapsedPlaybackTime]=@([[ZQPlayerTool sharePlayerTool] currentTime]);
//總時(shí)間
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;
}
下面就剩下遠(yuǎn)程控制音樂播放了
#pragma mark -- 響應(yīng)鎖屏點(diǎn)擊
-(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;
}
}
到這里一個(gè)簡單的音樂播放器就完成了,不怎么會講解蜗搔,具體實(shí)現(xiàn)還是看demo吧劲藐,如果有什么疑問或者發(fā)現(xiàn)什么不足,歡迎指正樟凄。如果有時(shí)間的話后續(xù)會添加些動畫效果和細(xì)節(jié)修改聘芜,最后的最后,別忘了點(diǎn)贊收藏??
參考鏈接: