歌詞處理-顯示歌詞 - (Obj-C)

上一篇文章講到歌詞處理(時(shí)間最岗、歌詞的截取),接下來將歌詞顯示到視圖

實(shí)現(xiàn)的大概流程:
歌詞與進(jìn)度條上顯示的時(shí)間一樣,需要實(shí)時(shí)的去更新,所以
1.封裝一個(gè)更新歌詞的方法,在定時(shí)器方法中實(shí)時(shí)調(diào)用
2.聲明一個(gè)全局的屬性,用來記錄當(dāng)前歌詞的索引,通過索引取出當(dāng)前句歌詞賦值

// 更新歌詞
- (void)updateLyric{
    
    // 當(dāng)前歌詞
    JSLyricModel *currentLyric = self.lyricModelArray[self.currentLyricIndex];
    
    // 下一句歌詞  ( 2.判斷越界問題)
    JSLyricModel *nextLyric = nil;
    if (self.currentLyricIndex == self.lyricModelArray.count - 1) {
        
        // 創(chuàng)建一個(gè)最大的下一句歌詞
        nextLyric = [[JSLyricModel alloc]init];
        // 給自定義出來的最后一條歌詞設(shè)置數(shù)據(jù)  (設(shè)置成最后一條歌詞的數(shù)據(jù))
        nextLyric.content = currentLyric.content;
        // 因?yàn)楫?dāng)前索引已經(jīng)是最后一條歌詞,所以上面的歌詞賦值就相當(dāng)于nextLyric.content = [self.lyricModelArray lastObject].content;
        // 直接設(shè)置成歌曲的總時(shí)長
        nextLyric.initialTime = [JSMusciManager sharedMusicManager].duration;
        
    }else{
        
        nextLyric = self.lyricModelArray[self.currentLyricIndex + 1];
    }
    
    // 正向調(diào)整進(jìn)度(判斷越界問題): 判斷時(shí)間,改變當(dāng)前的歌詞的索引  : 當(dāng)前播放時(shí)間 > 下一句歌詞的起始時(shí)間 歌詞索引 +1
    if ([JSMusciManager sharedMusicManager].currentTime > nextLyric.initialTime && self.currentLyricIndex < self.lyricModelArray.count - 1) {
        
        self.currentLyricIndex++;
        
        //  拖拽進(jìn)度條時(shí),只需要顯示最近當(dāng)前歌詞,防止拖動歌詞逐條跳動
        [self updateLyric];
        // 1. 當(dāng)累加到正確的當(dāng)前歌詞索引時(shí),下面才給歌詞賦值,否則遞歸調(diào)用返回
        return;
        // 如果不進(jìn)行遞歸調(diào)用直接return: 這里更新數(shù)據(jù)的定時(shí)器間隔時(shí)間為0.1s,假如將進(jìn)度條拖拽到歌詞索引60的位置,那么等到定時(shí)器自動調(diào)用到到歌詞索引為60的歌詞數(shù)據(jù)時(shí),需要6s的時(shí)間才可以
        
    }
    
    // 反向調(diào)整進(jìn)度(判斷越界問題): 當(dāng)前時(shí)間 < 當(dāng)前句歌詞的初始時(shí)間 歌詞索引-1
    if ([JSMusciManager sharedMusicManager].currentTime < currentLyric.initialTime && self.currentLyricIndex > 0) {
        
        self.currentLyricIndex--;
        [self updateLyric];
        return;
    }
    
    self.verticalLyricLabel.text = self.lyricModelArray[self.currentLyricIndex].content;
    
    
}

需要考慮的點(diǎn)有:

  • 調(diào)整進(jìn)度條切歌:

先進(jìn)行遞歸調(diào)用,如果自增得到的該條歌詞索引不是我們調(diào)整進(jìn)度條所在歌詞的索引,直接return返回,不進(jìn)行歌詞賦值

[self updateLyric];// 調(diào)用自己
return;

如果不進(jìn)行遞歸調(diào)用直接return: 這里更新數(shù)據(jù)的定時(shí)器間隔時(shí)間為0.1s,假如將進(jìn)度條拖拽到歌詞索引60的位置,那么等到定時(shí)器自動調(diào)用到到歌詞索引為60的歌詞數(shù)據(jù)時(shí),需要6s的時(shí)間才可以,所以需要通過遞歸調(diào)用的方式,直到找到正確的歌詞索引后不滿足自增或自減條件了,進(jìn)行歌詞賦值,及時(shí)的在視圖上同步歌詞

  • 歌詞數(shù)組越界:

上面的代碼中直接使用了所以進(jìn)行了判斷,假設(shè)這首歌有60句歌詞,已經(jīng)到了第60句,再次自加就會出現(xiàn)越界問題,所以只有當(dāng)當(dāng)前歌詞索引小于(數(shù)組長度-1)的時(shí)候才進(jìn)行自加,同理,反向調(diào)整進(jìn)度條時(shí),只有當(dāng)當(dāng)前歌詞索引大于零時(shí)才進(jìn)行自減

當(dāng)"當(dāng)前歌詞"索引為最后一條時(shí),下面需要使用下一條歌詞來判斷,所以這里設(shè)置一條虛擬的最后一條歌詞模型

    if (self.currentLyricIndex == self.lyricModelArray.count - 1) {
        // 創(chuàng)建一個(gè)最大的下一句歌詞 (虛擬數(shù)據(jù))
        nextLyric = [[JSLyricModel alloc]init];
        // 給自定義出來的最后一條歌詞設(shè)置數(shù)據(jù)  (設(shè)置成最后一條歌詞的數(shù)據(jù))
        nextLyric.content = currentLyric.content;
        // 因?yàn)楫?dāng)前索引已經(jīng)是最后一條歌詞,所以上面的歌詞賦值就相當(dāng)于nextLyric.content = [self.lyricModelArray lastObject].content;
        // 直接設(shè)置成歌曲的總時(shí)長
        nextLyric.initialTime = [JSMusciManager sharedMusicManager].duration;  
    }

下面的判斷處理需要一個(gè)下一條歌詞:

if ([JSMusciManager sharedMusicManager].currentTime > nextLyric.initialTime && self.currentLyricIndex < self.lyricModelArray.count - 1)

這里先給最后一條虛擬的歌詞模型設(shè)置了屬性,從判斷條件來看,暫時(shí)這里還用不到最后一條虛擬歌詞的數(shù)據(jù),后面的設(shè)置歌詞根據(jù)進(jìn)度變色會用到

  • 切歌后的索引越界

前面對當(dāng)前播放歌曲的歌詞索引進(jìn)行了越界判斷,不同歌曲的歌詞不同,所以索引值不同,防止切歌后索引混亂甚至越界,在點(diǎn)擊切換歌曲按鈕后,要將索引清零
(上一曲廷臼、下一曲按鈕點(diǎn)擊事件中)

    // 切歌索引清零
    self.currentLyricIndex = 0;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖掷倔,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眉孩,死亡現(xiàn)場離奇詭異个绍,居然都是意外死亡勒葱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門巴柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凛虽,“玉大人,你說我怎么就攤上這事广恢】” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵钉迷,是天一觀的道長至非。 經(jīng)常有香客問我,道長糠聪,這世上最難降的妖魔是什么荒椭? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮舰蟆,結(jié)果婚禮上趣惠,老公的妹妹穿的比我還像新娘。我一直安慰自己身害,他們只是感情好味悄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著塌鸯,像睡著了一般侍瑟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丙猬,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天丢习,我揣著相機(jī)與錄音,去河邊找鬼淮悼。 笑死咐低,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袜腥。 我是一名探鬼主播见擦,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羹令!你這毒婦竟也來了鲤屡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤福侈,失蹤者是張志新(化名)和其女友劉穎酒来,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肪凛,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堰汉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年辽社,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘鸭。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滴铅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出就乓,到底是詐尸還是另有隱情汉匙,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布生蚁,位于F島的核電站噩翠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏邦投。R本人自食惡果不足惜绎秒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尼摹。 院中可真熱鬧见芹,春花似錦、人聲如沸蠢涝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽和二。三九已至徘铝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惯吕,已是汗流浹背惕它。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留废登,地道東北人淹魄。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像堡距,于是被迫代替她去往敵國和親甲锡。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,754評論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法羽戒,類相關(guān)的語法缤沦,內(nèi)部類的語法,繼承相關(guān)的語法易稠,異常的語法缸废,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 模仿QQ音樂播放器歌詞視圖,默認(rèn)進(jìn)入視圖: 當(dāng)手指從右向左滑動時(shí),出現(xiàn)一個(gè)滾動歌詞視圖 配圖###### 接下來就...
    ShenYj閱讀 835評論 1 2
  • 我想我們都需要試著放松一下,都需要停下來聽一聽自己內(nèi)心的聲音,都需要培養(yǎng)一種讓自己快樂的能力企量。 我們都該停下來测萎,等...
    展筠閱讀 247評論 0 0
  • 心純凈绳泉,行更遠(yuǎn)# 作為一個(gè)獨(dú)居的女生逊抡,我偏向簡樸恭謹(jǐn)?shù)纳钅沸骸E紶柵d致來了,把小房間徹底翻動冒嫡,累到一身汗的時(shí)候靜靜地...
    Maria西瀅閱讀 424評論 0 2