lixiang1994 / AttributedString

基于Swift插值方式优雅的构建富文本, 支持点击长按事件, 支持不同类型过滤, 支持自定义视图等.
MIT License
846 stars 76 forks source link

自定义构造 Attribute #42

Closed HParis closed 2 years ago

HParis commented 2 years ago

我的需求是希望能自定义构造字符串差值过程中使用自定义的 attributes

// 构造自定义的 Attribute
extension ASAttributedString.Attribute {

    public static func fontStyle(_ value:  UIFont.TextStyle) -> Self {
        let font = UIFont.preferredFont(forTextStyle: value)

        let style = NSMutableParagraphStyle()
        style.minimumLineHeight = 20
        style.maximumLineHeight = 20

        let baselineOffset = (20 - font.lineHeight) * 0.5

        return .init(attributes: [
            .font: font,
            .paragraphStyle: style,
            .baselineOffset: baselineOffset
        ])
    }
}
// 用法如下:
 """
        \("fontStyle: .sbuheadline", .fontStyle(.subheadline), .background(UIColor.systemBackground), .foreground(UIColor.label))
"""

但是目前由于 Attribute 的 attributes 是 internal 的,导致无法构造自定义的 attributes.

lixiang1994 commented 2 years ago

其实你可以扩展实现 比如:

public extension Array where Element == ASAttributedString.Attribute {

    static var defalut: [ASAttributedString.Attribute] = [
        .font(.systemFont(ofSize: 13)),
        .foreground(.black)
    ]

    static let xxxx: [ASAttributedString.Attribute] = []
}
HParis commented 2 years ago
image

按照上面的扩展实现报错了。

lixiang1994 commented 2 years ago
\("test", with: .defalut)
HParis commented 2 years ago

但是这样的话,后面就无法在增加其他 attribute 属性了。

还是希望能实现这样的调用效果:

""" ("fontStyle: .sbuheadline", .fontStyle(.subheadline), .background(.systemBackground), .foreground(.label)) """

lixiang1994 commented 2 years ago
\("test", with: .defalut + [.kern(1), .xxxxx])
HParis commented 2 years ago

嗯嗯,好的。

谢谢!