天天看點

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