Dynamic Type in iOS 7: Not Quite as "Dynamic" as You Might Think

One of the nice features in iOS 7 for old fogeys such as myself is that the user can use the general Settings to increase and decrease the fonts used in apps. This is called "Dynamic Type." Judging by developer forums, I'm not the only one who thought that this was something that was built in to the various widgets. It's not. To do this in your own app, you have to respond to the ContentSizeCategoryChanged notification and invalidate the layout in any widgets you want to have change size. In Xamarin.iOS, the code looks like this:

[code lang="csharp"]
public class ContentView : UIView
{
public ContentView()
{
var txt = new UITextView(UIScreen.MainScreen.Bounds);
txt.Text = "Lorem ipsum dolor ...";
ResetDynamicType();
//Respond to notification of change
UIApplication.Notifications.ObserveContentSizeCategoryChanged((s,e) => {
ResetDynamicType();
});
AddSubview(txt);
}
public void ResetDynamicType()
{
txt.Font = UIFont.PreferredFontForTextStyle(UIFontTextStyle.Body);
}
}
[/code]

The crucial point being that you have a ResetDynamicType method (or whatever you want to call it) that you call both at initialization and then again every time you get notified of a request to change font size (if you want, you can read the new size from the e in the lambda). So "Dynamic Type" isn't really anything special in terms of display: it's still up to the application developer to have a function that's called. What is dynamic is the value returned by UIFont.PreferredFontForTextStyle, which varies based on the user's Settings.

[video width="362" height="522" mp4="/uploads/2013/08/screenflow_dynamic_text.mp4"][/video]