從 iOS 7 開始應用程式內的文字都可以支援「動態字級」DynamicType,它可以讓應用程式內的文字依照使用者的喜好變更大小,你可以在設定 > 一般 > 文字大小中設定字級的層級,在返回應用程式之後,系統將會依據動態字級的層級給予文字新的定義。
在實作支援動態字級的應用程式前,首先要先了解它的運作方式,設定動態字級是屬於全域的行為,意思就是它影響的層級是是在裝置內的所有應用程式,我們可以在程式中的任意位置使用 UIFont 的 preferredFontForTextStyle: 函式來取得目前的文字層級,所以,如果想要支援動態字級的效果,在設定 UIFont 時就必須使用 preferredFontForTextStyle: 函式來取得相關的參數,而非使用自行定義的 UIFont 格式。
//支援動態字級的 Headline Text Style
UIFont *myFont = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
[_myLabel setFont:newFont];
另外,你會想如果使用者是在使用的途中才去更改動態字級的層級,那該怎麼辦?這時,你就會需要 NSNotificationCenter 的幫助了,透過訂閱 UIContentSizeCategoryDidChangeNotification 事件,來取得使用者更改字級層級的當下,進而更新應用程式內的文字與排版。
//訂閱UIContentSizeCategoryDidChangeNotification事件
//觸發事件時呼叫myNotification:函式
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myNotification:) name:UIContentSizeCategoryDidChangeNotification object:nil];
你可以在觸發的事件中更新你的文字大小,或是重新安排整個版面。
- (void)myNotification:(NSNotification *)aNotification {
//重新繪製像是UITable等物件的Layout
[self.view setNeedsLayout];
//取得新的UIFont並套用
UIFont *newFont = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
[_myLabel setFont:newFont];
//將目前所取的的字級再放大兩倍並套用
CGFloat newSize = [newFont pointSize] * 2.0;
[_myLabel setFont:[UIFont fontWithName:[newFont fontName] size:newSize]];
}
採用動態字級的同時,也必須考慮整個應用程式的版面配置,像是文字的間距、行高、類型或是粗細等等,其他有關文字上的設定,請參考官方的 UIFont Class Reference 和 Using Text Kit to Draw and Manage Text 文件。
沒有留言:
張貼留言