Intermediate iOS 11 Programming with Swift (三) :動(dòng)態(tài)表格視圖Cell

本文是Intermediate iOS 11 Programming with Swift 4系列?的 第 三 篇.

3.0

當(dāng)您閱讀本章時(shí)腾降,我假設(shè)您已經(jīng)知道如何使用UITableView來顯示數(shù)據(jù)。如果沒有的話碍论,回去看看《Swift book》的iOS 11編程入門

UITableView類提供了一種以表形式顯示信息的強(qiáng)大方式寒砖,它是iOS應(yīng)用程序中最常用的組件之一赐劣。無論你是在構(gòu)建一個(gè)“應(yīng)用程序”、“待辦事項(xiàng)應(yīng)用程序”還是“社交應(yīng)用程序”哩都,你都可以用一種或另一種形式來使用表格視圖魁兼。UITableView的默認(rèn)實(shí)現(xiàn)是初步的,只適用于基本的應(yīng)用茅逮。為了將應(yīng)用程序與其他應(yīng)用程序區(qū)分開來璃赡,您通常為表視圖和表單元格提供定制,以便使應(yīng)用程序脫穎而出献雅。

在本章中碉考,我將向您展示一種強(qiáng)大的技術(shù),通過添加微妙的動(dòng)畫來活躍您的應(yīng)用程序挺身。多虧了內(nèi)置的api侯谁。對(duì)表視圖單元格進(jìn)行動(dòng)畫處理非常簡單。同樣章钾,為了演示動(dòng)畫是如何完成的墙贱,我們將調(diào)整一個(gè)現(xiàn)有的基于表格的應(yīng)用程序并添加一個(gè)微妙的動(dòng)畫。

首先贱傀,從這里下載項(xiàng)目模板惨撇。下載后,編譯應(yīng)用程序府寒,確保你能正確運(yùn)行它魁衙。它只是一個(gè)顯示文章列表的非常簡單的應(yīng)用程序报腔。

3.1


為表視圖單元格創(chuàng)建一個(gè)簡單的漸隱動(dòng)畫

讓我們首先對(duì)基于表的應(yīng)用程序進(jìn)行調(diào)整,使其具有簡單的漸隱效果剖淀。那么纯蛾,當(dāng)表行出現(xiàn)時(shí),我們?nèi)绾翁砑舆@個(gè)微妙的動(dòng)畫呢? ?如果您查看UITableViewDelegate協(xié)議的文檔纵隔,您應(yīng)該找到一個(gè)名為tableView(_:willDisplay:forRowAt:)的方法:

optional func tableView(_ tableView: UITableView,

? ? ? ? ? willDisplay cell: UITableViewCell,

? ? ? ? ? ? forRowAt indexPath: IndexPath)

方法將在繪制行之前被調(diào)用翻诉。通過實(shí)現(xiàn)該方法,您可以自定義單元格對(duì)象捌刮,并在顯示單元格之前添加您自己的動(dòng)畫碰煌。以下是創(chuàng)建漸隱效果所需的內(nèi)容。在ArticleTableViewController.swift中插入代碼片段:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

? ? // Define the initial state (Before the animation)

? ? cell.alpha = 0

? ? // Define the final state (After the animation)

? ? UIView.animate(withDuration: 1.0, animations: { cell.alpha = 1 })

}

Core Animation為iOS開發(fā)人員提供了一種創(chuàng)建動(dòng)畫的簡單方式绅作。您需要做的就是定義可視化元素的初始和最終狀態(tài)拄查。Core Animation隨后將找出這兩種狀態(tài)之間所需的動(dòng)畫。

在上面的代碼中棚蓄,我們首先將單元格的初始alpha值設(shè)置為0,這表示完全透明碍脏。然后我們開始動(dòng)畫;將持續(xù)時(shí)間設(shè)置為1秒梭依,并定義單元格的最終狀態(tài),完全不透明典尾。這將在表單元格出現(xiàn)時(shí)自動(dòng)創(chuàng)建漸隱效果役拴。

現(xiàn)在可以編譯和運(yùn)行應(yīng)用程序了。

使用CATransform3D創(chuàng)建旋轉(zhuǎn)效果

容易,對(duì)吧?只需幾行代碼钾埂,您的應(yīng)用程序看起來就與基于表格的標(biāo)準(zhǔn)應(yīng)用程序有點(diǎn)不同河闰。tableView(_:willDisplay:forRowAt:)方法是實(shí)現(xiàn)表格視圖單元格動(dòng)畫的關(guān)鍵。您可以在方法中實(shí)現(xiàn)任何類型的動(dòng)畫褥紫。

漸隱動(dòng)畫就是一個(gè)例子〗裕現(xiàn)在讓我們嘗試使用CATransform3D實(shí)現(xiàn)另一個(gè)動(dòng)畫。別擔(dān)心髓考,你只需要幾行代碼部念。

若要將旋轉(zhuǎn)效果添加到表單元格,請(qǐng)更新如下方法:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

? ? // Define the initial state (Before the animation)

? ? let rotationAngleInRadians = 90.0 * CGFloat(Double.pi/180.0)

? ? let rotationTransform = CATransform3DMakeRotation(rotationAngleInRadians, 0, 0, 1)

? ? cell.layer.transform = rotationTransform

? ? // Define the final state (After the animation)

? ? UIView.animate(withDuration: 1.0, animations: { cell.layer.transform = CATransform3DIdentity })

}

與前面一樣氨菇,我們定義轉(zhuǎn)換的初始和最終狀態(tài)儡炼。一般的想法是我們先順時(shí)針旋轉(zhuǎn)90度,然后把它恢復(fù)到正常的方向查蓉,也就是最終的狀態(tài)乌询。

好的,但是我們?cè)趺茨茼槙r(shí)針旋轉(zhuǎn)90度的表格單元呢?

關(guān)鍵是使用CATransform3DMakeRotation函數(shù)來創(chuàng)建旋轉(zhuǎn)變換豌研。函數(shù)有四個(gè)參數(shù):

弧度的角度——這是旋轉(zhuǎn)的角度妹田。由于角度是弧度唬党,我們首先需要把角度轉(zhuǎn)換成弧度。

? ? ? ? x軸-這是從屏幕左邊到屏幕右邊的軸秆麸。

? ? ? ? y軸——這是從屏幕頂部到屏幕底部的軸初嘹。

? ? ? ? z軸-這是指向屏幕外的軸"

由于旋轉(zhuǎn)是圍繞Z軸的,我們將這個(gè)參數(shù)的值設(shè)為1沮趣,而將X軸和Y軸的值設(shè)為0屯烦。一旦我們創(chuàng)建轉(zhuǎn)換,它就被分配給單元格的層房铭。

接下來驻龟,我們開始動(dòng)畫的持續(xù)時(shí)間為1秒。單元格的最終狀態(tài)被設(shè)置為CATransform3DIdentity缸匪,它將把單元格重置為原始位置翁狐。

好了,點(diǎn)擊運(yùn)行來測試這個(gè)應(yīng)用程序!

3.2


提示:你可能想知道CATransform3D是什么凌蔬。它實(shí)際上是一個(gè)表示矩陣的結(jié)構(gòu)露懒。在三維空間中進(jìn)行旋轉(zhuǎn)等變換涉及到一些矩陣的計(jì)算。我不會(huì)講矩陣計(jì)算的細(xì)節(jié)砂心。如果你想了解更多懈词,你可以查看這里.


用CATransform3DTranslate創(chuàng)建一個(gè)飛行的效果。

旋轉(zhuǎn)效果看起來很酷嗎?您可以進(jìn)一步調(diào)整動(dòng)畫以使其更好辩诞。嘗試更改tableView(_:willDisplay:forRowAt:)方法坎弯,并使用以下代碼行替換rotationTransform的初始化:

let rotationTransform = CATransform3DTranslate(CATransform3DIdentity, -500, 100, 0)

代碼行只是轉(zhuǎn)換或移動(dòng)單元格的位置。它表示單元格向左移動(dòng)了500點(diǎn)(負(fù)值)译暂,向下移動(dòng)了100點(diǎn)(正值)抠忘。Z軸沒有變化。

現(xiàn)在你可以再次測試這個(gè)應(yīng)用了外永。點(diǎn)擊“運(yùn)行”按鈕崎脉,就可以玩“飛行”了

3.3


現(xiàn)在,每當(dāng)您在表格中滾動(dòng)時(shí)象迎,單元格動(dòng)畫都會(huì)顯示出來荧嵌,無論您是向下滾動(dòng)還是向上滾動(dòng)表格視圖±剩”雖然動(dòng)畫很不錯(cuò)啦撮,但是如果動(dòng)畫顯示得太頻繁,用戶會(huì)覺得很煩人汪厨。您可能只希望在單元格第一次出現(xiàn)時(shí)顯示動(dòng)畫赃春。嘗試修改現(xiàn)有的項(xiàng)目并添加該限制。

總結(jié)

在本章中劫乱,我向您展示了表格單元?jiǎng)赢嫷幕A(chǔ)知識(shí)织中。嘗試更改轉(zhuǎn)換的值锥涕,看看會(huì)得到什么效果。

可以在這里查看原作者的項(xiàng)目.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狭吼,一起剝皮案震驚了整個(gè)濱河市层坠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刁笙,老刑警劉巖破花,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疲吸,居然都是意外死亡座每,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門摘悴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來峭梳,“玉大人,你說我怎么就攤上這事蹂喻〈型郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵口四,是天一觀的道長挫以。 經(jīng)常有香客問我,道長窃祝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任踱侣,我火速辦了婚禮粪小,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抡句。我一直安慰自己探膊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布待榔。 她就那樣靜靜地躺著逞壁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锐锣。 梳的紋絲不亂的頭發(fā)上腌闯,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音雕憔,去河邊找鬼姿骏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斤彼,可吹牛的內(nèi)容都是我干的分瘦。 我是一名探鬼主播蘸泻,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼嘲玫!你這毒婦竟也來了悦施?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤去团,失蹤者是張志新(化名)和其女友劉穎抡诞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渗勘,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沐绒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旺坠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乔遮。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖取刃,靈堂內(nèi)的尸體忽然破棺而出蹋肮,到底是詐尸還是另有隱情,我是刑警寧澤璧疗,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布坯辩,位于F島的核電站,受9級(jí)特大地震影響崩侠,放射性物質(zhì)發(fā)生泄漏漆魔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一却音、第九天 我趴在偏房一處隱蔽的房頂上張望改抡。 院中可真熱鬧,春花似錦系瓢、人聲如沸阿纤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欠拾。三九已至,卻和暖如春骗绕,著一層夾襖步出監(jiān)牢的瞬間藐窄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工酬土, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枷邪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像东揣,于是被迫代替她去往敵國和親践惑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 用到的組件 1嘶卧、通過CocoaPods安裝 2尔觉、第三方類庫安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,621評(píng)論 1 180
  • 好了好了 別說了 我愛你 170322 2355
    小名王蕊蕊閱讀 174評(píng)論 0 0
  • 小小四張書簽畫了三個(gè)小時(shí)芥吟,中間給孩子把尿哄睡一次侦铜,哈哈,只想說:腰好累钟鸵!還沒壓平钉稍,湊乎看吧,沒有水彩紙了棺耍,用的水溶...
    一筆一畫一世界閱讀 257評(píng)論 0 3
  • 時(shí)間過得真快贡未,今年都快過完了。今天的我還在不斷地犯同樣的錯(cuò)誤蒙袍,真是對(duì)不起別人更對(duì)不起自己俊卤。項(xiàng)目總負(fù)責(zé)是我,分項(xiàng)是別...
    繆培閱讀 311評(píng)論 0 0
  • 01 接到父親的電話時(shí)是早上,我還在上課以现,拒接了狠怨。等到下午吃過好飯,看通話記錄邑遏,才發(fā)現(xiàn)我還沒有回電話取董。 接通電話,...
    刀子ABC閱讀 466評(píng)論 2 6