Gliphy 0.3.0

Gliphy 0.3.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2016 年 5 月
SPM支持 SPM

Scott Williams 维护。



Gliphy 0.3.0

Gliphy Logo

Build script

动态类型。这是一项很棒的技术,可以使您的应用更易于视力不佳的用户使用。此外,它还可以在支持不同语言时使自动布局变得更容易。实现它并不太难,但涵盖所有内容可能有点繁琐。

Gliphy 旨在让它变得容易,同时在过程中为您提供一些额外的优势。

屏幕截图

Gliphy Screencast

特点

  • 出色的动态类型管理
  • 自定义字体
  • Cocoapods 支持
  • Swift 包管理器支持(当 Swift 3 发布时!)

要求

  • iOS 8.0+
  • Xcode 7
  • Swift 2

用法

以下是最简单到最复杂的方式说明它是如何工作的

没有 Gliphy

首先,让我们简要回顾一下如何在您的应用中启用动态类型。在代码中,您可以使用以下方法实现:

titleLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)

或者在 Interface Builder 中设置适当的文本样式。

Xcode Font Panels

现在您的标签将与“标题”样式相关联,并自动调整为 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 RanchBNRDynamicTypeManager 库构建的。利用它,您可以监视图并让 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文件以获取更多详细信息。