制作簡易音樂播放器:
1.功能:音樂清單,播放,暫停,上一曲,下一曲,進度條(顯示進度時間,控制進度),随機播放,單曲循環,順序播放,歌詞顯示等
2.使用架構:AVFoundation
3.知識點:AVPlayer 使用,pch 檔案使用,封裝思想,MVC模式,storyBoard的使用,消息發送機制,觀察者,block回調,nstimer,nsrunloop,空間限制,第三方使用等
詳細過程:
一.布局 :使用 storyBoard 布局
1.歌曲清單界面:使用 TableViewController ,建立相應的 viewController , 繼承于 UITableViewController ,與 storyBoard 控件相關聯,實作相應方法
2.播放頁面:添加相應控件,添加限制條件 , 建立相應的 viewController , 繼承于 UIViewController ,與 storyBoard 控件相關聯,實作相應方法
難點:播放圖檔與歌詞頁面 ----> a.添加一個 ScrollView ,設定适當高度,寬度等于螢幕寬 b. 在ScrollView 添加一個 View ,與 Scroll 等高,寬度是 ScrollView 的兩倍,距 ScrollView 上下左為零, c. 在 View 視圖添加一個兩個 UIView(播放和歌詞頁面) 子視圖,播放頁面距 view 上下左都為 0 ,寬度為螢幕寬,歌詞頁面距 view 頁面上下右 都為 0,寬度為螢幕寬.在播放頁面添加 imageView 作為播放圖檔顯示,在歌詞頁面添加 tableView 作為歌詞顯示.
二.擷取歌曲資訊
伺服器端資料資訊不規範,是 plist 檔案,可以直接擷取 array 形式.
三.對擷取資訊進行解析
1.建立 Model ,在網絡擷取到的歌詞是 NSString 類型,需要對其進行處理,轉化為兩個數組,一個存放歌詞時間資訊,一個存放歌詞内容.使用到 NSString 的 componentsSeparatedByString 方法,把字元串根據某個字元切割轉化為資料
2.把擷取到的資料數組轉化為 Model 資料
四.封裝播放控制類
1.使用單例:由于播放器在一個程式中隻能有一個,如果過多會出現聲音雜亂的情況.
2.應用 block :添加 bloak ,使得可以在 ViewController 可以通過回調控制視圖,
3.添加監聽:用來監聽音樂的播放完成和音樂加載完成,實作其相應的操作.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playToEnd) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];//監聽音樂播放完成
[playItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];//監聽音樂加載完成
4.應用NStimer , NSRunloop ,實作對播放的時時控制:使用回調控制 圖檔旋轉,進度條,歌詞滾動.
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playTimer) userInfo:nil repeats:YES];
//将定時器加入 runloop 中
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
[self.timer fire];
5.AVPlayer 知識點: a. AVPlayer 需要建立 AVPlayerItem ,資料的加載監聽是對他的 status 屬性德監聽 b. 計算目前播放了多少秒 CGFloat timer = _avPlayer.currentTime.value / _avPlayer.currentTime.timescale; c. 擷取歌曲總時長: _sumTime = self.avPlayer.currentItem.duration.value / self.avPlayer.currentItem.duration.timescale; d. 設定特定得時間播放點 self.avPlayer seekToTime:CMTimeMakeWithSeconds(timer * _sumTime, self.avPlayer.currentTime.timescale) completionHandler:^(BOOL finished) {}];
五.對界面處理
難點:對歌詞的處理 [self.lyricTableView selectRowAtIndexPath:[self lyricTableViewTime:timer] animated:YES scrollPosition:UITableViewScrollPositionMiddle];
計算 IndexPath 方法:
- (NSIndexPath*)lyricTableViewTime:(CGFloat)time{
for (int i = 0 ; i < model.timerArray.count ; i++){
CGFloat timeArray = [model.timerArray[i] AG_StringToTime];
if (time < timeArray){
return [NSIndexPath indexPathForItem:(i - 1 > 0 ? i - 1 : 0) inSection:0];
}
}
return [NSIndexPath indexPathForItem:model.timerArray.count - 1 inSection:0];
}
使 cell 透明 : cell.backgroundColor = [UIColor clearColor];
改變 cell 選中時的背景 : cell.selectedBackgroundView = view;
自己寫的小demo下載下傳
