可變cell,自適應cell,理解iOS 8中的Self Sizing Cells和Dynamic Type

來源:互聯網
上載者:User

標籤:

在iOS 8中,蘋果引入了UITableView的一項新功能--Self Sizing Cells,對於不少開發人員來說這是新SDK中一項非常有用的新功能。在iOS 8之前,如果想在表視圖中展示可變高度的動態內容時,你需要手動計算行高,而Self Sizing Cells為展示動態內容提供了一個解決方案。以下是你使用Self Sizing Cells時需要注意的事項:

1.為原型儲存格定義Auto Layout約束

2.指定表視圖的estimatedRowHeight 

3.將表視圖的rowHeight屬性設定為UITableViewAutomaticDimension

如果用代碼錶示最後兩點,那就是

12 tableView.estimatedRowHeight = 44.0tableView.rowHeight = UITableViewAutomaticDimension

僅有兩行代碼,你通知表視圖計算儲存格的尺寸以匹配內容和和動態進行渲染。Self Sizing Cells功能可以為你節省大量寫代碼的時間,你喜歡愛上它!

使用Self Sizing Cells構建簡單的Demo

學習新知識的最好辦法莫過於使用它,我們將要開發一個簡單的Demo來闡釋Self Sizing Cell。我們從工程模板開始,一個簡單的以表為主的應用展示了旅店列表。原型儲存格包含兩個單行的文字標籤,一個是名稱,一個是地址。下載並運行樣本工程,你會看到以下介面:

有圖所知,由於行高是固定的,所以一些旅店的地址被縮短了。在開發人員包含大量表視圖的應用時,你可能會經常遇見此類問題。過去,你可能需要通過縮小 文字大小或者增加行數來解決該問題。不過從iOS 8以後,你所需要的是使用Self Sizing Cells來正確展示儲存格內容,無論內容有多長。

添加Auto Layout約束

你可能會厭惡並盡量避免使用Auto Layout。不過沒有Auto Layout,Self Sizing Cells功能也是無法工作的,它依賴約束來確定合適的行高。事實上,表視圖會調用systemLayoutSizeFittingSize並返回基於布 局約束的儲存格尺寸。

如果你是頭一次使用Auto Layout,推薦你先看下Auto Layout Introduction。

本文所用的項目模板並沒有使用Auto Layout約束,所以我們要首先添加一個。對於旅店名稱標籤,點擊自動布局菜單的"Pin"按鈕,並添加4個間距約束。

為地址標籤添加左、右以及下方三個約束。

正確配置好約束後,介面如下:

設定預估行高

配置完自動布局後,接下來要在ViewController的viewDidLoad方法中添加如下代碼:

12 tableView.estimatedRowHeight = 68.0tableView.rowHeight = UITableViewAutomaticDimension

第一行代碼設定了儲存格的預估行高,就是現有的原型儲存格的高度。第二行代碼是改變UITableViewAutomaticDimension的rowHeight屬性,這是iOS 8中預設的行高。換句話說,你通知表視圖基於其他資訊來算出儲存格的尺寸大小。

如果你測試應用,那麼會發現儲存格此時是不可調整的,原因是旅店的名稱和地址標籤被設定在一行代碼中,所以將程式碼數設定為零,並允許標籤自動成長。

再次編譯並運行app,表視圖儲存格會根據內容調整。

A Bug?!

我不確定這是不是一個bug,但是UseYourLoaf也注意到了這個問題(博文:Self Sizing Table View Cellshttp://useyourloaf.com/blog/2014/08/07/self-sizing-table-view- cells.html)。當首次展示表視圖時,你會發現一些儲存格不能正確調整大小。但是當你滾動表視圖時,新儲存格的行高是正確的。你可以在視圖展示後 強制重載以解決這個問題。

12345     override func viewDidAppear(animated: Bool) {             tableView.reloadData()         }

Dynamic Type

Self Sizing Cell對於支援Dynamic Type非常有用。你可能沒聽說過Dynamic Type,但你可能見過系統的“Settings”螢幕:

Dynamic Type最初由iOS 7引入,允許使用者自訂文字大小從而滿足app的需要。不過僅有採用Dynamic Type的app才能響應文本的改變,可能只有一小部分第三方應用使用了該功能。

從iOS 8開始,蘋果想要鼓勵開發人員使用Dynamic Type。正如在WWDC session中提到的那樣,所有蘋果系統級應用都使用了Dynamic Type,並且內建的標籤已經有了動態字型。當使用者改變文字大小時,這些標籤也會改變其大小。

更進一步說,Self Sizing Cell的引入是促進Dynamic Type使用的辦法,它可以節省大量寫代碼調整行高的時間。如果儲存格可以自動調整了,那麼使用Dynamic Type就很顯而易見了。

你只需要從尺寸固定的自訂字型中將字型更改為文本類型(比如標題和內容主體)首選的字型。也就是說當你運行app時,它會適應文字大小的改變。

總結

你已經通過本文瞭解了基本的Self Sizing Cells和Dynamic Type。我們鼓勵你使用新功能,並更新app以支援Dynamic Type。Self Sizing Cell是我最喜歡的iOS 8功能之一,僅需兩行代碼,你就可以適應儲存格中的動態內容。此外,你可以在此下載完整的項目,不過請注意我使用的是Xcode 6 Beta 7來建立項目。

可變cell,自適應cell,理解iOS 8中的Self Sizing Cells和Dynamic Type

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.