/ Tool

Swifty NSAttributed String

Swifty NSAttributed String

AttributedString.swift

Swifty NSAttributed String.

Problem

The problem is attributes is a [NSAttributedStringKey: Any], even though the keys NSAttributedString.Key are all defined, the values still a type of Any, which means we have to deal with literally Anything. And feel like it's not swift.

Installation

AttributedString.swift is available through CocoaPods. To install
it, simply add the following line to your Podfile:

pod 'AttributedString.swift'

How to use

After installation, Just import AttributedString_swift

import AttributedString_swift

When adding more attributes on a NSMutableAttributedString, you can use the func addAttributes(attrs:[Attribute], for scope:Scope).

Scope has currently have 3 types: .all, .subtext, closedRange.

Example

import AttributedString_swift

let label1 = Label()
let label2 = Label()
...

label1.attributedText = NSAttributedString(
  string: "Hello World", 
  attrs:[
    .font(UIFont.boldSystemFont(ofSize: 30)),
    .link("https://www.google.com")
  ])

let attrText2 = NSMutableAttributedString(
  string: "The quick brown fox jump over the lazy dog.",
  attrs: [
    .font(.systemFont(ofSize: 18)),
    .foregroundColor(.orange)
  ])

// Adding more attributes!
attrText2.addAttributes(
  attrs: [
    .font(.boldSystemFont(ofSize: 50)),
    .foregroundColor(.gray)
  ],
  for: .subtext("The"))

attrText2.addAttributes(
  attrs: [
    .foregroundColor(.green),
    .font(.systemFont(ofSize: 50))
  ],
  for: .closedRange(4...8))

attrText2.addAttributes(
  attrs: [
    .foregroundColor(.red),
    .font(.boldSystemFont(ofSize: 50))],
  for: .closedRange(10...15))

attrText2.addAttributes(
  attrs: [
    .font(.boldSystemFont(ofSize: 30)),
    .link("https://en.wikipedia.org/wiki/Dog"),
  ],
  for: .subtext("dog"))

// With paragraph style for whole text
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
attrText2.addAttributes(
  attrs: [
    .paragraphStyle(paragraphStyle)
  ],
  for: .all)

label2.attributedText = attrText2

To run the example project, clone the repo, and run pod install from the Example directory first.

GitHub