en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

10.02.2013

製作具有動態字級的文字

  

從 iOS 7 開始應用程式內的文字都可以支援「動態字級」DynamicType,它可以讓應用程式內的文字依照使用者的喜好變更大小,你可以在設定 > 一般 > 文字大小中設定字級的層級,在返回應用程式之後,系統將會依據動態字級的層級給予文字新的定義。

在實作支援動態字級的應用程式前,首先要先了解它的運作方式,設定動態字級是屬於全域的行為,意思就是它影響的層級是是在裝置內的所有應用程式,我們可以在程式中的任意位置使用 UIFontpreferredFontForTextStyle: 函式來取得目前的文字層級,所以,如果想要支援動態字級的效果,在設定 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 文件。






沒有留言:

張貼留言