ios音樂播放器-仿QQ音樂

非常感謝大家利用自己寶貴的時(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)贊收藏??

參考鏈接:

iOS 音樂播放器之鎖屏歌詞+歌詞解析+鎖屏效果

iOS音樂播放器開發(fā)(一)-思路與設(shè)計(jì)

iOS鏤空文字缝龄、類歌詞進(jìn)度顯示文字

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汰现,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子叔壤,更是在濱河造成了極大的恐慌瞎饲,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炼绘,死亡現(xiàn)場離奇詭異嗅战,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饭望,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門仗哨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铅辞,你說我怎么就攤上這事厌漂。” “怎么了斟珊?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵苇倡,是天一觀的道長。 經(jīng)常有香客問我囤踩,道長旨椒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任堵漱,我火速辦了婚禮综慎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勤庐。我一直安慰自己示惊,他們只是感情好好港,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著米罚,像睡著了一般钧汹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上录择,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天拔莱,我揣著相機(jī)與錄音,去河邊找鬼隘竭。 笑死塘秦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的动看。 我是一名探鬼主播嗤形,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弧圆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笔咽,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搔预,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叶组,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拯田,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年甩十,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了船庇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侣监,死狀恐怖鸭轮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情橄霉,我是刑警寧澤窃爷,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站姓蜂,受9級特大地震影響按厘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钱慢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一逮京、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧束莫,春花似錦懒棉、人聲如沸草描。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陶珠。三九已至,卻和暖如春享钞,著一層夾襖步出監(jiān)牢的瞬間揍诽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工栗竖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暑脆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓狐肢,卻偏偏與公主長得像添吗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子份名,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容