swift實(shí)現(xiàn)的單詞高亮

公司做的一款教育App中,有個(gè)BookReading模塊是孩子用來學(xué)習(xí)英語,里面又有一個(gè)子模塊Listen用來播放句子,產(chǎn)品的需求是要求單詞跟隨著句子的播放而高亮,效果如下;GitHubDemo地址下載,這種需求之前沒做過,網(wǎng)上搜索的也沒有資料(有的也是歌詞的高亮),所以花費(fèi)了點(diǎn)時(shí)間,現(xiàn)在趁閑暇時(shí)間寫了個(gè)小小的demo,和大家分享,整個(gè)代碼寫的比較基礎(chǔ),有相似需求的可以借鑒,不懂的地方歡迎相互交流

wordHilightGif.gif

整體思路

1、根據(jù)服務(wù)器提供的json數(shù)據(jù)格式,demo中即為lrc.json,知道每個(gè)單詞都有讀的對(duì)應(yīng)的開始時(shí)間,

lrcjson.png

其中我定義了一個(gè)var wordRanges = [NSRange](),用來存儲(chǔ)每個(gè)單詞的Range,用來匹配相應(yīng)單詞的高亮。

let textStr: NSString = section!.text
        self.wordRanges.removeAll() // 在下一次添加之前,得先刪除之前的
        weak var weakSelf = self
        textStr.enumerateSubstringsInRange(NSMakeRange(0, textStr.length), options: .ByWords) { (substring, substringRange, enclosingRange, bb) in
            weakSelf!.wordRanges.append(substringRange)
        }

2、使用CADisplayLink添加到mainRunloop中,來實(shí)現(xiàn)不停的重繪UI工作,相比于定時(shí)器精確度更高

private func setupTimer() {
        displayLink = CADisplayLink(target: self, selector: #selector(BookCollectionViewController.displayWord))
        displayLink?.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSDefaultRunLoopMode) // mode 為 NSRunLoopCommonModes
        // 調(diào)用的頻率 默認(rèn)為值1,代表60Hz,即每秒刷新60次,調(diào)用每秒 displayWord() 60次,這里設(shè)置為10,代表6Hz
        displayLink?.frameInterval = 10
    }

核心代碼如下:

func displayWord() {
        let cell = self.collectionView.visibleCells().first as! BookCollectionViewCell
        let indexPath = collectionView.indexPathForCell(cell)
        
        guard let page = model?.pages[(indexPath?.item)!] else {return}
        guard let section = page.sections.first else {return}
        var i = 0
        while true {
            let curTime = audioPlayer?.currentTime ?? 0 // 播放聲音的的時(shí)間,ms
            
            guard (wordRanges.first != nil) else {break}
            
            let word = section.words[i]
            
            let curRange = wordRanges[i]
            if Int(curTime * 1000) >=  Int(word.cueStartMs) { // 拿當(dāng)前播放的聲音時(shí)間與json每個(gè)單詞的開始讀取時(shí)間相比,
                attributeStr?.addAttributes([NSForegroundColorAttributeName: UIColor.whiteColor()], range: NSMakeRange(0, attributeStr!.length))
                attributeStr?.addAttributes([NSForegroundColorAttributeName: UIColor.redColor()], range: curRange)
                cell.content.attributedText = attributeStr
            }
            
            i += 1
            
            if i >= wordRanges.count || i >= section.words.count {
                break
            }
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,421評(píng)論 4 61
  • 大學(xué)士張英的次子張廷玉,字衡臣,號(hào)硯齋,祖籍安徽桐城,清康熙三十九年考中進(jìn)士,后改庶吉士,授檢討,入值南書房。在張...
    悠悠千古事閱讀 1,453評(píng)論 0 0
  • 牛爸牛牛的爸爸閱讀 283評(píng)論 1 4
  • 我試過很多方式不去想 你的一顰一笑,你的溫柔大方, 你的每一個(gè)動(dòng)作、每一個(gè)表情、每一個(gè)舉動(dòng), 我走過曾經(jīng)你走過的路...
    zuixiyang閱讀 108評(píng)論 0 0
  • 今晚就畫你啦 長風(fēng)破浪會(huì)有時(shí),直掛云帆濟(jì)滄海。 (線稿稍有凌亂)
    艾娃手繪閱讀 150評(píng)論 0 1

友情鏈接更多精彩內(nèi)容