Latest 3.0.0
Homepage https://github.com/Mindgrub/Swash
License MIT
Platforms ios 8.2, tvos 9.0, watchos 2.0

Version
Swift 5
Platforms
Carthage compatible
License

Swash is a simple, safe, and expressive abstraction of UIFont with baked-in support for dynamic type.

Usage

To define a custom font, just create a String enum that conforms to the Font protocol.

enum Papyrus: String, Font {
    case regular = "Papyrus"
    case condensed = "Papyrus-Condensed"
}

That’s all you need to start using your font in your project!

Static Sizes

label.font = Papyrus.regular.of(size: 17)

Dynamic Type (iOS 11+)

Uses UIFontMetrics for scaling. Setting adjustsFontForContentSizeCategory to true tells the label to automatically update the font when the user changes their content size preference. See our blog post for guidance on choosing default sizes for text styles, or just use Swash’s provided defaults pulled from Apple’s Human Interface Guidelines for iOS, watchOS, and tvOS.

label1.adjustsFontForContentSizeCategory = true
label2.adjustsFontForContentSizeCategory = true

label1.font = Papyrus.condensed.of(textStyle: .headline)
// Optional size cutoff and default size.
label2.font = GillSans.bold.of(textStyle: .title1, defaultSize: 28, maxSize: 38)

Dynamic Type Demo

Dynamic Type (Before iOS 11)

Uses system font scaling, no default size value. adjustsFontForContentSizeCategory requires the use of UIFontMetrics, so it is of no use for custom fonts before iOS 11. You’ll have to update the fonts manually, either in traitCollectionDidChange(_:) or by observing the UIContentSizeCategoryDidChange notification.

label.font = Papyrus.condensed.of(style: .headline)
// Optional size cutoff
label.font = GillSans.bold.of(style: .title1, maxSize: 30)

System Font

You can use SystemFont to support dynamic type for different weights and further unify the font syntax in your project.

label1.font = SystemFont.light.of(size: 17)
label2.adjustsFontForContentSizeCategory = true
label2.font = SystemFont.preferred.of(textStyle: .body)
label3.font = SystemFont.semiboldItalic.of(textStyle: .body, maxSize: 30)

Important note: adjustsFontForContentSizeCategory only works with SystemFont for the preferred weight with a nil maxSize value. In any other case, you will need to update the font either in traitCollectionDidChange(_:) or by observing the UIContentSizeCategoryDidChange notification. This is because the preferred weight directly returns the result of UIFont.preferredFont(forTextStyle:).

Generate Boilerplate

Swash can attempt to log your font boilerplate for you!

Swash.logBoilerplate(forFontsWithFamilyNamesContaining: "gill")

Output:

enum GillSans: String, Font {
    case GillSans-Italic = "GillSans-Italic"
    case GillSans-SemiBold = "GillSans-SemiBold"
    case GillSans-UltraBold = "GillSans-UltraBold"
    case GillSans-Light = "GillSans-Light"
    case GillSans-Bold = "GillSans-Bold"
    case GillSans = "GillSans"
    case GillSans-SemiBoldItalic = "GillSans-SemiBoldItalic"
    case GillSans-BoldItalic = "GillSans-BoldItalic"
    case GillSans-LightItalic = "GillSans-LightItalic"
}

Just copy-paste the output into your project. You’ll probably still need to doctor the case names a bit.

Debug Crashing

If your custom font fails to initialize, assertionFailure(_:file:line:) is called. This will crash debug builds with the default -Onone compiler optimization set. This is to help identify failed font initializations which can otherwise be hard to catch. Release builds with higher optimization levels will NOT crash, so you don’t have to worry about your app crashing in production over a silly font.

Installation

CocoaPods

pod 'Swash'

Carthage

github "Mindgrub/Swash"

Make sure to specify your platform when you update (e.g. carthage update --platform iOS). Otherwise all 3 frameworks (iOS, tvOS, and watchOS) will be added.

License

Swash is available under the MIT license. See the LICENSE file for more info.

Latest podspec

{
    "name": "Swash",
    "version": "3.0.0",
    "summary": "A simple, safe, and expressive abstraction of UIFont with baked-in support for dynamic type.",
    "homepage": "https://github.com/Mindgrub/Swash",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    },
    "authors": "Mindgrub",
    "source": {
        "git": "https://github.com/Mindgrub/Swash.git",
        "tag": "3.0.0"
    },
    "social_media_url": "https://twitter.com/mindgrub",
    "platforms": {
        "ios": "8.2",
        "tvos": "9.0",
        "watchos": "2.0"
    },
    "swift_version": "5.0",
    "source_files": "Source/**/*.swift"
}

Pin It on Pinterest

Share This