[譯] Animating text layers using CoreAnimation and CoreText frameworks in iOS SDK

原文地址: Animating text layers using CoreAnimation and CoreText frameworks in iOS SDK

4月13號 使用iOS SDK中的CoreAnimation和CoreText實現(xiàn)文本層動畫

CoreAnimation是一個非常強大的框架阔加。通過使用CABasicAnimationCAKeyFrameAnimation或者CAAnimationGroup背犯,我們可以創(chuàng)建驚艷的用戶體驗來王滤,同時基本上是沒有什么限制的幔托。僅僅取決于我們想要在屏幕上展示什么和它是怎么交互的。事實證明缔逛,CoreAnimation也可以和一些其他的框架(如CoreGraphics或者CoreText)組合使用,這也給了開發(fā)者創(chuàng)造更加驚艷的動畫的能力尼桶。使用CoreTextCoreAnimation我們可以給任何指定字體類型和字體大小的文本添加動畫。在這篇文章中我會展示一種方式如何做到這樣锯仪。

CoreText基礎(chǔ)

首先泵督,讓我向大家展示一下CoreText的基礎(chǔ)。為了給文本添加動畫庶喜,我們必須知道線條(line)和象形符號(glyph)是什么小腊,這會幫助我們理解從一個文本生成一條路徑(path)的整個過程。蘋果已經(jīng)為我們奠定了CoreText的基礎(chǔ)知識溃卡。所有的這些都可以在下面看到溢豆。下面是我收集的最重要的信息。

在此層次結(jié)構(gòu)的頂部是frame setter對象瘸羡。帶有屬性的字符串和圖形路徑作為輸入。一個frame setter生成文本的一個或者多個frame搓茬。每一個frame對象都代表一個段落犹赖。要生成frameframe setter調(diào)用一個typesetter對象卷仑。當一個frame setter奠定一個特定的frame的時候峻村,它適用于段落樣式,包括對齊方式锡凝,制表位粘昨,或者行距等屬性。typesetter將這些帶有屬性的字符串中的字符轉(zhuǎn)換成象形字符(glyphs)窜锯,同時也適合那些象形字符(glyphs)形成填充文字框的線條张肾。

每一個frame對象包含段落的線對象,它代表一個段落中文本的一行锚扎。一個frame對象可能只包含一個單一的長line對象吞瞪,也可能包含一系列的line。line對象在frame設(shè)置時期被typesetter創(chuàng)建驾孔。每一個line對象包含一組象形字符運行(glyph run)對象芍秆。一個象形字符運行(glyph run)是一組共享相同屬性和方向的連續(xù)象形字符(glyph)惯疙。typesetter創(chuàng)建象形字符運行(glyph run)就像它從字符串、屬性和字體對象生產(chǎn)line一樣妖啥。這意味著霉颠,一個line構(gòu)成一個或者多個象形字符運行(glyph run)。在層次結(jié)構(gòu)的尾部是通常代表單個文本字符的象形字符(glyph)對象荆虱。經(jīng)過我們對CoreText的基本熟悉蒿偎,我們現(xiàn)在可以文本層動畫了。

Animating text layer

為了給文本層添加動畫克伊,我們需要將其轉(zhuǎn)換成CGPath對象酥郭。首先我們必須創(chuàng)建我們想要添加動畫的帶屬性的字符,然后我們?yōu)榱说玫较笮巫址\行(glyph run)不得不從這個字符串中創(chuàng)建一個line對象愿吹。下面的代碼展示了我們?nèi)绾螌崿F(xiàn)這些目的:

let attrString  = NSAttributedString(string: text, attributes: [kCTFontAttributeName as String : font])
let line        = CTLineCreateWithAttributedString(attrString)
let runArray    = CTLineGetGlyphRuns(line)

這里我們將所有的象形字符運行(glyph run)保存在runArray中不从。我們通過這個數(shù)組循環(huán),并且從每一個象形字符運行(glyph run)來看犁跪,我們可以得到這些字體椿息,以及所有相應(yīng)的象形字符(glyph)。現(xiàn)在我們可以通過遍歷所有的象形字符(glyph)來選出特定的象形字符(glyph)對象坷衍。當我們有了這個對象寝优,我們可以計算它的位置,并使用CTFontCreatePathForGlyph函數(shù)將其轉(zhuǎn)換成path對象枫耳。通過擁有一個路徑就知道它的位置乏矾,我們就可以創(chuàng)建一個有象形字符(glyph)路徑組合而成的總體路徑。下面的偽代碼顯示了整體算法:

%For each glyph run
for runIndex in 0..<CFArrayGetCount(runArray) {
     let runFont = %Get a font from a single glyph

     %For each glyph in a single glyph run
     for runGlyphIndex in 0..<CTRunGetGlyphCount(run) {
                var glyph    = %Get a glyph
                var position = %Get glyph’s position

                %Get a letter path from a single glyph
                let letter = CTFontCreatePathForGlyph(runFont, glyph, nil)
                 %Make a translation to a desired position
                var t = CGAffineTransformMakeTranslation(position.x, position.y)
                 %Add a single letter path to the whole path  
                CGPathAddPath(letters, &t, letter)
            }
     }

之后我們已經(jīng)將我們的文本轉(zhuǎn)換成path對象迁杨,并將其添加到路徑層钻心,我們就可以使用下面代碼簡單添加動畫了:

let pathAnimation       = CABasicAnimation(keyPath: "strokeEnd")
pathAnimation.duration  = duration
pathAnimation.fromValue = 0.0
pathAnimation.toValue   = 1.0
pathAnimation.delegate  = self
pathLayer?.addAnimation(pathAnimation, forKey: "strokeEnd")

為了達到給文本層添加動畫的目的,一個VRMTextAnimator類被創(chuàng)建了铅协。這個類和示范文本層動畫的示例工程在這里可以找到捷沸。

為了使用這個類,你不得不使用帶有一個reference view的初始化方式init(referenceView:)``初始化狐史。reference view是一種類型的視圖痒给,其中我們執(zhí)行文本動畫。VRMTextAnimator有兩個關(guān)鍵屬性骏全,animationLayerpathLayer苍柏。第一個是我們要執(zhí)行動畫的CALayer對象,第二個是CAShapeLayer對象吟温,它存儲從我們之前設(shè)定的文字創(chuàng)造了一個CGPath對象序仙。這個類也有三個可設(shè)置的屬性:字體名稱/fontName,字體尺寸/fontSize鲁豪,textToAnimate潘悼。如果我們想要動畫一個特定的文本與他的字體和字體大小律秃,我們需要設(shè)置這些屬性,VRMTextAnimator`也有一個代理對象治唤,可以通知我們動畫的起點和終點棒动。

在這個項目中,有兩種類型的文本層動畫宾添。第一種動畫是簡單的開始按鈕觸發(fā)的船惨,第二種是通過滑塊控制的。事實證明缕陕,我們可以設(shè)置它的speed粱锐,fromValuetoValue扛邑,durationtimeOffset屬性怜浅。如果我們設(shè)置fromValue為0,toValue為1蔬崩,duration為1恶座,同時我們正在動畫pathLayer對象的strokeEnd屬性,我們就可以通過設(shè)置pathLayertimeOffset屬性來繪制文本輪廓的相應(yīng)部分沥阳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跨琳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桐罕,更是在濱河造成了極大的恐慌脉让,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件功炮,死亡現(xiàn)場離奇詭異侠鳄,居然都是意外死亡,警方通過查閱死者的電腦和手機死宣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碴开,“玉大人毅该,你說我怎么就攤上這事×逝#” “怎么了眶掌?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巴碗。 經(jīng)常有香客問我朴爬,道長,這世上最難降的妖魔是什么橡淆? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任召噩,我火速辦了婚禮母赵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘具滴。我一直安慰自己凹嘲,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布构韵。 她就那樣靜靜地躺著周蹭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疲恢。 梳的紋絲不亂的頭發(fā)上凶朗,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音显拳,去河邊找鬼棚愤。 笑死,一個胖子當著我的面吹牛萎攒,可吹牛的內(nèi)容都是我干的遇八。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耍休,長吁一口氣:“原來是場噩夢啊……” “哼刃永!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起羊精,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斯够,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喧锦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體读规,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年燃少,在試婚紗的時候發(fā)現(xiàn)自己被綠了束亏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡阵具,死狀恐怖碍遍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阳液,我是刑警寧澤怕敬,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站帘皿,受9級特大地震影響东跪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一虽填、第九天 我趴在偏房一處隱蔽的房頂上張望丁恭。 院中可真熱鬧,春花似錦卤唉、人聲如沸涩惑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竭恬。三九已至,卻和暖如春熬的,著一層夾襖步出監(jiān)牢的瞬間痊硕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工押框, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留岔绸,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓橡伞,卻偏偏與公主長得像盒揉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兑徘,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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

  • 整理中... 文本布局 TextLayout = Glyphs + Locations參考:活字印刷 Glyphs...
    DBreak閱讀 15,570評論 17 71
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫刚盈、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • 系列文章: CoreText實現(xiàn)圖文混排 CoreText實現(xiàn)圖文混排之點擊事件 CoreText實現(xiàn)圖文混排之文...
    老司機Wicky閱讀 40,167評論 221 432
  • 蟬挂脑,捕捉到秋的體味 抖落一身的虛情假意 葡萄跨越濃陰走向了 成熟 讓人嘗到了酸甜的死亡 迤邐的風景在朋友圈里瘋長...
    荒山小調(diào)閱讀 168評論 0 1
  • 昨夜世界是你的藕漱,夜晚也是你的 歡迎回到你的家園,你的故土 院子里的小樹已和陽光達成共識 朝南的樹冠郁郁蔥蔥 你的名...
    芴忘閱讀 153評論 0 2