动态类型。这是一项很棒的技术,可以使您的应用更易于视力不佳的用户使用。此外,它还可以在支持不同语言时使自动布局变得更容易。实现它并不太难,但涵盖所有内容可能有点繁琐。
Gliphy 旨在让它变得容易,同时在过程中为您提供一些额外的优势。
以下是最简单到最复杂的方式说明它是如何工作的
首先,让我们简要回顾一下如何在您的应用中启用动态类型。在代码中,您可以使用以下方法实现:
titleLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
或者在 Interface Builder 中设置适当的文本样式。
现在您的标签将与“标题”样式相关联,并自动调整为 iOS 中存储的“标题”文本的适当字体大小。但如果是用户更改了字体设置,更改不会反映出来,直到您的应用退出并重新启动。为了避免这种麻烦,您需要监控 UIContentSizeCategoryDidChangeNotification
。
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(MyViewController.contentSizeCategoryDidChange(_:)),
name: UIContentSizeCategoryDidChangeNotification,
object: nil)
func contentSizeCategoryDidChange(_: NSNotification) {
titleLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
}
想象一下,您需要为应用中的每个文本渲染视图都做这件事。现在您明白我所说的“繁琐”是什么意思了。
此外,您仍然被困在系统字体中。想要使用像 Avenir 这样的字体?太糟糕了。
Gliphy 是基于 Big Nerd Ranch 的 BNRDynamicTypeManager 库构建的。利用它,您可以监视图并让 DynamicTypeManager
处理捕获通知并重置文本样式。
我们还扩展了它,允许您在实际需要时替换自定义字体。
import UIKit
import Gliphy
override func viewDidLoad() {
super.viewDidLoad()
Gliphy.sharedInstance.watchLabel(titleLabel, textStyle: UIFontTextStyleHeadline, fontName: "Georgia")
}
现在,您的 titleLabel
将始终是 Georgia,并在字体大小更改时自动缩放。这确实更好,但当您开始想象您将需要在应用中有数百个字段,都需要类似的一条代码时,这仍然比较繁琐。
在Gliphy 0.3版本中,增加了StyleWatcher
模块。现在您可以为容器视图内的所有视图创建一个StyleConfig
对象,并应用于它们。
首先在Interface Builder中设置您的文本样式,然后定义一个样式
// This can go in your AppDelegate or wherever.
func setupStyle() {
var config = StyleConfig()
config.label[UIFontTextStyleHeadline] = "Verdana"
config.label[UIFontTextStyleCaption1] = "MarkerFelt-Thin"
config.button[UIFontTextStyleHeadline] = "Verdana"
config.textField[UIFontTextStyleBody] = "Verdana"
config.textField[UIFontTextStyleCaption1] = "Helvetica"
StyleWatcher.defaultConfig = config
}
以下是您如何查看所有ViewController
中的视图的方法
let watcher = StyleWatcher()
override func viewDidLoad() {
super.viewDidLoad()
watcher.watchViews(inView: view)
}
watchViews
会递归遍历子视图并监视相应字段,因此您只需调用一次即可完成。
如果您需要自定义配置,可以向watchViews
添加一个。
watcher.watchViews(inView: view, withConfig: myCustomConfig)
iOS 7提供了几个基本文本样式
UIFontTextStyleHeadline
UIFontTextStyleSubheadline
UIFontTextStyleBody
UIFontTextStyleFootnote
UIFontTextStyleCaption1
UIFontTextStyleCaption2
iOS 9又增加了一些
UIFontTextStyleTitle1
UIFontTextStyleTitle2
UIFontTextStyleTitle3
UIFontTextStyleCallout
这些都是很好的,但如果需要其他无法放入那里的东西呢?比如“UIFontTextStyleReallyReallyReallyBigTitle”?Gliphy 允许您使用DynamicFontRegistry
类监视自己定义的文本样式。
DynamicFontRegistry.registry.addTextStyle("UIFontTextStyleReallyReallyReallyBigTitle",
scaledFrom: UIFontTextStyleHeadline,
byFactor: 4)
然后就像使用其他任何东西一样使用该文本样式。
Gliphy.sharedInstance.watchLabel(heroLabel, textStyle: "UIFontTextStyleReallyReallyReallyBigTitle", fontName: "MarkerFelt-Thin")
// or
StyleWatcher.defaultConfig.label["UIFontTextStyleReallyReallyReallyBigTitle"] = "MarkerFelt-Thin"
Xcode 7.3和7.3.1存在一个bug,模拟器无法接收到Gliphy依赖的UIContentSizeCategoryDidChangeNotification
通知。在设备上运行正常。 已在此处提交雷达报告。
MIT许可证。请参阅LICENSE
文件以获取更多详细信息。