iOS 11 的第二篇~~~html
當用戶在更改手機設置裏的字體大小時,App 裏面的字體也跟着進行大小變化。這大概就是Dynamic Type
吧。UI上的顯示,用戶的體驗,這些都更加友好吧。swift
iOS 11 更新的Dynamic Type
,主要是UIFontMetrics
這個玩意兒。比方說UILabel
,在使用的時候,須要設置adjustsFontForContentSizeCategory = true
,這樣能確保 UI 在用戶在設置-顯示
裏面更改字體大小的時候,App 裏的 UI 字體大小也會隨着變化。其實,在 iOS 10 的時候,這個屬性就己經放出來了。模擬器裏面是沒有這個選項的話,須要到設置裏面, General - Accessibility - Larger Text ,這裏進行一個更改字體大小。app
Dynamic Type
對字體有必定的要求。以往咱們都是使用——佈局
func systemFont(ofSize fontSize: CGFloat) -> UIFont字體
進行一個字體設置,或者是使用自定義字體——spa
init?(name fontName: String, size fontSize: CGFloat)code
可是,若是要使用adjustsFontForContentSizeCategory
,那麼以上這兩個熟悉的方法就不能使用了。對於這個, 爸爸對字體進行了規定。有點相似多級標題,正文啊那些。上下 WWDC keynote 的那張圖。清楚的代表了對應的字體大小。htm
使用Storyboard
或者xib
進行佈局的時候,都比較簡單。只須要在對應位置更改就行。把Font
給成body
,title
等這些對應的字體,再者就是把automatically adjusts font
給鉤上。圖片
至於代碼實現呢,在 iOS 10 ,是這樣的。it
label.font = UIFont.preferredFont(forTextStyle: .body) label.adjustsFontForContentSizeCategory = true
以上這兩個實現都是 iOS 10 就己經支持的了。可是,有個弊端,就是沒法對自定義字體進行支持。因而,iOS 11 帶來更強大的UIFontMetrics
。
UIFontMetrics
的使用也比較簡單。
let customFont = UIFont.systemFont(ofSize: 20) label.font = UIFontMetrics.default.scaledFont(for: customFont) label.adjustsFontForContentSizeCategory = true
固然,UIFontMetrics
的使用還不止這些。包括能夠限制最大字號等。
另外,網頁也可使用,可是隻限制於 設備。在CSS
中的font
,選擇-apple-system-title1
,-apple-system-body
等。不過若是要在非 設備上使用的話,你能夠須要備用字體什麼鬼的吧。上個?。
<body> <label style="font: -apple-system-title1">label use apple system title1</label> <br><br><br> <label> label no use apple system font</label> </body>
除了字體方面的變化,WWDC
還提到了一些隨着字體變化,UI 的變化,須要更改。好比 label 顯示應該進行換行,而不是一行,而後後續...表示。這樣的極爲不美觀的。另外,必要時還須要更改一些 UI 的 位置、約束等。UITableView
則建議使用自動行高。
對此, 提供了相應的方法判斷。不過這方法iOS 7
就支持了~
if UIApplication.shared.preferredContentSizeCategory > .accessibilityExtraExtraLarge { // 更改一些對應的UI。。吧啦吧啦 } else { // 更改一些對應的UI。。吧啦吧啦 }
WWDC 也提到了圖片可使用Dynamic Type
,用於UIImageView
上。只須要把圖片用PDF
格式放進assets
裏面。另外,將圖片格式致於1x
,或者是右側的scale
從individual scales
改爲single scales
。選擇Preserve Vector Data
看圖~~
類型UILabel
,UIImageView
也須要設置下。
imageView.adjustsImageSizeForAccessibilityContentSizeCategory = true
IB 黨的話,則是
以往tabBar
都是麼有變化的。使用Dynamic Type
後,長按tabBarItem
會出現一個彈窗。如圖。
能夠經過如下代碼設置
guard let firstTabBarItem = tabBar.items?.first else { return } firstTabBarItem.largeContentSizeImage = 圖片
或者是
BarItem
除了使用PDF
格式的圖片外,也可使用75p * 75p
大小的png
等。
Dynamic Type
大體就這些內容。我的以爲侷限性有點大吧。若是碰上覆雜的 UI 。。。