這篇文章主要寫一個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吧,如果有什麼疑問或者發現什麼不足,歡迎指正。如果有時間的話後續會添加些動畫效果和細節修改,最後的最後,别忘了點贊收藏