TextKit之便笺实战
便笺练习功能点:
通过实现以下特效,练习并掌握布局管理器(layout manger),文本容器(text containers)和文本存储器(text storage)等用法。
- 动态样式(Dynamic type)
- 凸版印刷效果(Letterpress effects)
- 环绕路径(Exclusion paths)
- 动态文本格式及存储(Dynamic text formatting and storage)
这个应用中我们将实现回流文本,字体大小的动态变换,以及闪回文本等效果。
效果图:
App开始运行后自动生成一组便笺实例并利用tableViewController
显示出来。Storyboards
和segues
会将被选中的单元格所对应的便笺内容显示出来以供用户编辑。
项目开发包:Notepad.zip
动态样式
动态样式(Dynamic type)
是iOS 7里面变化最大的特性之一; 它使得app可以遵从用户选择的字体大小和粗细。
选择 通用->文字大小 或 通用->辅助功能 来查看app中的字体设置。
iOS 7 支持通过粗体
、设置字体大小
等方式提高支持动态文本的应用的易读性。
例如**UIFont
**新增的一个方法: preferredFontForTextStyle
用来根据用户对字体大小的设置来自动制定字体样式。
下面表格中是六种可用字体样式的示例:
最左边一列是最小字体;中间一列是最大字体;最右边一列是粗体效果。
使用系统动态字体样式
使用动态文本,是通过给文本字体
设置字体样式style而不是指定具体的字体名称
和大小
。这样,系统会在运行时自动根据这一样式以及用户的字体大小设置来选择使用合适的字体。
preferredFontForTextStyle:
方法设置字体样式
- 打开
NoteEditorViewController.m/swift
在viewDidLoad:
方法实现的最后面加入以下代码: {%codeblock lang:objc%} self.textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; {%endcodeblock%} {% codeblock lang:swift %} self.textView.font = UIFont.preferredFont(forTextStyle: .body) {% endcodeblock %} - 打开
NotesListViewController.m/swift
在tableView:cellForRowAtIndexPath:
方法中增加如下代码: {%codeblock lang:objc%} cell.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; {%endcodeblock%} {% codeblock lang:swift %} cell.textLabel?.font = UIFont.preferredFont(forTextStyle: .headline) {% endcodeblock %} 上面两行代码都用到了新版iOS的字体样式.
字体样式:通过语义法命名字体,例如
UIFontTextStyleSubHeadline
, 可以避免在代码里每一处都指定具体的字体名称和样式, 而且确保app能对用户的字体大小设置做出恰当的回应。
APP响应用户字体设置
- 设置系统字体
返回到通用->文字大小重新修改字体设置.
再运行App, Note页面的文字大小是当前设定的字体大小;前后截屏对比,分辨率小了一半。
- 设置系统字体生效 当我们返回到通用->文字大小重新修改字体设置. 再打开Note页面, 会发现app并没有立即对字体设置的变化做出相应反应。
监听系统通知:实现APP响应用户字体设置
当用户修改了他们的字体大小设置之后,这一样式对应的字体并不会自动更新,必须重新请求才能获取新的值。用户设置变化后,preferredFontForTextStyle:
方法返回的字体也会变化。
- 添加监听系统通知
UIContentSizeCategoryDidChangeNotification
通知APP响应用户字体设置的变化 打开NoteEditorViewController.m
并在viewDidLoad
方法的实现的最后加入以下代码: {%codeblock lang:objc%} [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(preferredContentSizeChanged:) name:UIContentSizeCategoryDidChangeNotification object:nil]; {%endcodeblock%} {%codeblock lang:swift%} //字体变化通知:调用preferredContentSizeChanged:方法 NotificationCenter.default.addObserver(self, selector: #selector(NoteEditorViewController.preferredContentSizeChanged(_:)), name: NSNotification.Name.UIContentSizeCategoryDidChange, object: nil) {%endcodeblock%} - 添加系统通知响应事件
收到用于指定本类接收字体设定变化的通知后,调用
preferredContentSizeChanged:
方法 在NoteEditorViewController.m
中viewDidLoad
方法之后紧接着添加以下方法: {%codeblock lang:objc%}
- (void)preferredContentSizeChanged:(NSNotification *)notification
{
self.textView.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
}
{%endcodeblock%}
{%codeblock lang:swift %}
//字体变化通知时调用
func preferredContentSizeChanged(_ notification:NSNotification)
{
self.textView.font = UIFont.preferredFont(forTextStyle: .body)
}
{%endcodeblock%}
这一方法作用是根据新的字体设置来设定
textView
中的字体。
Build并运行app,修改字体大小设置,Note页面就可以即时更新字体大小了。