web-dev-qa-db-fra.com

Swift 4 attributString obtient les attributs de frappe

J'essaie de créer AttributedString et d'ajouter les attributs de

typingAttributes(from textView)

Le problème est que

.typingAttributes

revenir

[String, Any]

et

NSAttributedString(string:.. , attributes:[])

besoins

[NSAttributedStringKey: Any]

Mon code:

NSAttributedString(string: "test123", attributes: self.textView.typingAttributes)

Je ne veux pas créer pour en cycle passer en revue toutes les clés et les changer en

NSAttributedStringKey
8
Altimir Antonov

Vous pouvez mapper le dictionnaire [String: Any] à un dictionnaire [NSAttributedStringKey: Any] avec

let typingAttributes = Dictionary(uniqueKeysWithValues: self.textView.typingAttributes.map {
    key, value in (NSAttributedStringKey(key), value)
})

let text = NSAttributedString(string: "test123", attributes: typingAttributes)

Voici une méthode d’extension possible à cet effet, elle est limitée aux dictionnaires avec des clés de chaîne:

extension Dictionary where Key == String {

    func toAttributedStringKeys() -> [NSAttributedStringKey: Value] {
        return Dictionary<NSAttributedStringKey, Value>(uniqueKeysWithValues: map {
            key, value in (NSAttributedStringKey(key), value)
        })
    }
}
9
Martin R

Encore meilleure solution je pense. J'ai créé une extension.

public extension Dictionary {
    func toNSAttributedStringKeys() -> [NSAttributedStringKey: Any] {
        var atts = [NSAttributedStringKey: Any]()

        for key in keys {
            if let keyString = key as? String {
                atts[NSAttributedStringKey(keyString)] = self[key]
            }
        }

        return atts
    }
}

https://Gist.github.com/AltiAntonov/f0f86e7cd04c61118e13f753191b5d9e

2
Altimir Antonov

Voici ma classe d'assistance, pour laquelle j'utilise des polices personnalisées

import UIKit

struct AttributedStringHelper {

enum FontType: String {
    case bold = "GothamRounded-Bold"
    case medium = "GothamRounded-Medium"
    case book = "GothamRounded-Book"
}

static func getString(text: String, fontType: FontType, size: CGFloat, color: UIColor, isUnderlined: Bool? = nil) -> NSAttributedString {

    var attributes : [NSAttributedStringKey : Any] = [
        NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue) : UIFont(name: fontType.rawValue, size: size)!,
        NSAttributedStringKey.foregroundColor : color]

    if let isUnderlined = isUnderlined, isUnderlined {
        attributes[NSAttributedStringKey.underlineStyle] = 1
    }

    let attributedString = NSAttributedString(string: text, attributes: attributes)
    return attributedString
}
}
0
Kelvin Fok