如何使用Swift创建属性字符串?


316

我正在尝试制作一个简单的咖啡计算器。我需要显示咖啡的克数。克的“ g”符号需要附加到我用来显示金额的UILabel上。UILabel中的数字随用户输入的变化而动态变化,但是我需要在字符串的末尾添加小写的“ g”,其格式与更新数字的格式不同。需要在数字上附加“ g”,以便随着数字大小和位置的变化,“ g”随数字“移动”。我敢肯定这个问题已经解决了,所以正确的链接会很有帮助,因为我已经用心搜索了。

我在文档中搜索了属性字符串,甚至从应用程序商店下载了“属性字符串创建器”,但是结果代码在Objective-C中,并且我正在使用Swift。一个很棒的示例,这显然是在Swift中使用属性字符串创建具有自定义属性的自定义字体的明显示例,并且可能对其他开发人员有所帮助。有关此操作的文档非常混乱,因为如何执行此操作的路径并不明确。我的计划是创建属性字符串,并将其添加到coffeeAmount字符串的末尾。

var coffeeAmount: String = calculatedCoffee + attributedText

其中calculatedCoffee是一个Int转换为字符串,而“ attributedText”是我尝试创建的具有自定义字体的小写字母“ g”。也许我正在以错误的方式进行操作。任何帮助表示赞赏!

Answers:


969

在此处输入图片说明

该答案已针对Swift 4.2进行了更新。

快速参考

制作和设置属性字符串的一般形式如下。您可以在下面找到其他常见选项。

// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) 

// set attributed text on a UILabel
myLabel.attributedText = myAttrString

文字颜色

let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]

背景颜色

let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]

字形

let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]

在此处输入图片说明

let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]

在此处输入图片说明

let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray

let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]

这篇文章的其余部分为感兴趣的人提供了更多详细信息。


属性

字符串属性只是形式为的字典[NSAttributedString.Key: Any],其中NSAttributedString.Key是属性的键名,Any是某些Type的值。该值可以是字体,颜色,整数或其他形式。Swift中有许多预定义的标准属性。例如:

  • 密钥名称:NSAttributedString.Key.font,值:aUIFont
  • 密钥名称:NSAttributedString.Key.foregroundColor,值:aUIColor
  • 键名:NSAttributedString.Key.link,值:NSURLNSString

还有很多。有关更多信息,请参见此链接。您甚至可以创建自己的自定义属性,例如:

  • 键名:NSAttributedString.Key.myName,值:某些类型。
    如果您进行扩展

    extension NSAttributedString.Key {
        static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
    }

在Swift中创建属性

您可以像声明任何其他字典一样声明属性。

// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
    NSAttributedString.Key.foregroundColor: UIColor.green,
    NSAttributedString.Key.backgroundColor: UIColor.yellow,
    NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]

请注意rawValue下划线样式值所需。

因为属性只是字典,所以您还可以通过创建一个空的字典,然后向其添加键值对来创建它们。如果该值将包含多种类型,则必须将其Any用作类型。这是multipleAttributes上面的示例,以这种方式重新创建的:

var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue

属性字符串

理解属性后,就可以创建属性字符串了。

初始化

有几种创建属性字符串的方法。如果您只需要一个只读字符串,则可以使用NSAttributedString。以下是一些初始化方法:

// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)

如果以后需要更改属性或字符串内容,则应使用NSMutableAttributedString。声明非常相似:

// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()

// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)

更改属性字符串

例如,让我们在这篇文章的顶部创建属性字符串。

首先创建一个NSMutableAttributedString具有新字体属性的。

let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )

如果您正在研究,请将属性字符串设置为UITextView(或UILabel),如下所示:

textView.attributedText = myString

不要使用textView.text

结果如下:

在此处输入图片说明

然后附加另一个未设置任何属性的属性字符串。(请注意,即使我以前letmyString上面声明过,我仍然可以对其进行修改,因为它是一个NSMutableAttributedString。这对我来说似乎并不像Swift一样,如果将来发生这种变化,我也不会感到惊讶。

let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)

在此处输入图片说明

接下来,我们仅选择“字符串”一词,该词以index开头,17长度为7。请注意,这是NSRange一个Swift而不是一个Swift Range。(有关范围的更多信息,请参见此答案。)该addAttribute方法使我们可以将属性键名称放在第一个位置,将属性值放在第二个位置,将范围放在第三个位置。

var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)

在此处输入图片说明

最后,让我们添加背景色。对于多样性,让我们使用addAttributes方法(请注意s)。我可以使用此方法一次添加多个属性,但我只会再次添加一个。

myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)

在此处输入图片说明

请注意,属性在某些地方重叠。添加属性不会覆盖已经存在的属性。

有关

进一步阅读


4
请注意,您可以结合使用多种样式来强调,例如NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue
beeb 2016年

3
您不能在NSAttributedString上使用appendAttributedString,而必须在NSMutableAttributedString上使用,可以更新您的答案以反映这一点吗?
约瑟夫·阿斯特拉罕

3
1)非常感谢您的回答。2)我建议您放置在答案的开头textView.atrributedtText = myString开头。作为一个新手,我只是在做,不需要我回答所有的问题。** 3)**这是否意味着您只能拥有其中之一,或者因为拥有它们都没有意义?4)我建议你也包含例如像这样在你的答案,因为它是非常有用的。5) ачаардахин– myLabel.attributedText = myStringmyLabel.textattributedTexttextlineSpacing
Honey

1
首先,添加和添加之间的区别是令人困惑的。appendAttributedString就像“字符串串联”。addAttribute正在为您的字符串添加新属性。
亲爱的

2
@Daniel addAttribute是的方法NSMutableAttributedString。没错,不能将其与String或一起使用NSAttributedString。(检查这篇文章myString的“ 更改属性字符串”部分中的定义。我认为我不赞成您,因为我还在myString文章的第一部分中使用了变量名,因为它是NSAttributedString。)
Suragch

114

Swift使用与NSMutableAttributedStringObj-C 相同的方式。您可以通过将计算值作为字符串传入来实例化它:

var attributedString = NSMutableAttributedString(string:"\(calculatedCoffee)")

现在创建属性g字符串(heh)。注意: UIFont.systemFontOfSize(_)现在是一个可失败的初始化程序,因此必须先将其拆开,然后才能使用它:

var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(19.0)!]
var gString = NSMutableAttributedString(string:"g", attributes:attrs)

然后附加:

attributedString.appendAttributedString(gString)

然后,您可以设置UILabel以显示NSAttributedString,如下所示:

myLabel.attributedText = attributedString

//Part 1 Set Up The Lower Case g var coffeeText = NSMutableAttributedString(string:"\(calculateCoffee())") //Part 2 set the font attributes for the lower case g var coffeeTypeFaceAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(18)] //Part 3 create the "g" character and give it the attributes var coffeeG = NSMutableAttributedString(string:"g", attributes:coffeeTypeFaceAttributes) 当我设置UILabel.text = coffeeText时,出现错误“ NSMutableAttributedString无法转换为'String'。有没有办法使UILabel接受NSMutableAttributedString?
dcbenji 2014年

11
当拥有属性字符串时,需要设置标签的attributedText属性而不是其text属性。
NRitH 2014年

1
这项工作正常,我的小写字母“ g”现在位于我的咖啡量文本的末尾
dcbenji 2014年

2
由于某种原因,我在使用NSAttributedString的行上收到错误“调用中的额外参数”。仅当我将UIFont.systemFontOfSize(18)切换为UIFont(名称:“ Arial”,大小:20)时,才会发生这种情况。有任何想法吗?
Unome

UIFont(name:size :)是失败的初始化程序,可能返回nil。您可以通过添加来显式打开它!最后,或者在将其插入字典之前,使用if / let语句将其绑定到变量。
2015年

21

Xcode 6版本

let attriString = NSAttributedString(string:"attriString", attributes:
[NSForegroundColorAttributeName: UIColor.lightGrayColor(), 
            NSFontAttributeName: AttriFont])

Xcode 9.3版本

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedStringKey.foregroundColor: UIColor.lightGray, 
            NSAttributedStringKey.font: AttriFont])

Xcode 10,iOS 12,Swift 4

let attriString = NSAttributedString(string:"attriString", attributes:
[NSAttributedString.Key.foregroundColor: UIColor.lightGray, 
            NSAttributedString.Key.font: AttriFont])

20

斯威夫特4:

let attributes = [NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Bold", size: 17)!, 
                  NSAttributedStringKey.foregroundColor: UIColor.white]

它不能编译Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
bibscy

我刚刚在最新的XCode(10 beta 6)中进行了尝试,并且确实可以编译,您确定要使用Swift 4吗?
亚当·巴顿

我正在使用Swift 3
bibscy

4
嗯,这就是问题所在,我的回答是粗体标题“ Swift 4”,我强烈建议您更新至Swift 4
Adam Bardon

@bibscy,您可以使用NSAttributedString.Key。***
Hatim

19

我强烈建议您使用属性字符串库。例如,当一个字符串具有四种不同的颜色和四种不同的字体时,它使操作变得更加容易。 这是我的最爱。它被称为SwiftyAttributes

如果您想使用SwiftyAttributes创建具有四种不同颜色和不同字体的字符串:

let magenta = "Hello ".withAttributes([
    .textColor(.magenta),
    .font(.systemFont(ofSize: 15.0))
    ])
let cyan = "Sir ".withAttributes([
    .textColor(.cyan),
    .font(.boldSystemFont(ofSize: 15.0))
    ])
let green = "Lancelot".withAttributes([
    .textColor(.green),
    .font(.italicSystemFont(ofSize: 15.0))

    ])
let blue = "!".withAttributes([
    .textColor(.blue),
    .font(.preferredFont(forTextStyle: UIFontTextStyle.headline))

    ])
let finalString = magenta + cyan + green + blue

finalString 将显示为

显示为图片


15

斯威夫特:xcode 6.1

    let font:UIFont? = UIFont(name: "Arial", size: 12.0)

    let attrString = NSAttributedString(
        string: titleData,
        attributes: NSDictionary(
            object: font!,
            forKey: NSFontAttributeName))

10

在iOS上处理属性字符串的最佳方法是使用界面生成器中的内置属性文本编辑器,并避免在源文件中对NSAtrributedStringKeys进行不必要的硬编码。

您以后可以使用以下扩展名在运行时动态替换placehoderls:

extension NSAttributedString {
    func replacing(placeholder:String, with valueString:String) -> NSAttributedString {

        if let range = self.string.range(of:placeholder) {
            let nsRange = NSRange(range,in:valueString)
            let mutableText = NSMutableAttributedString(attributedString: self)
            mutableText.replaceCharacters(in: nsRange, with: valueString)
            return mutableText as NSAttributedString
        }
        return self
    }
}

添加一个故事板标签,并带有如下所示的属性文本。

在此处输入图片说明

然后,您只需在每次需要时更新值,如下所示:

label.attributedText = initalAttributedString.replacing(placeholder: "<price>", with: newValue)

确保将原始值保存到initalAttributedString中。

您可以通过阅读以下文章更好地了解这种方法:https : //medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e


这对于我的案例非常有帮助,我有一个Storyboard,只是想在标签中的部分字符串中添加粗体。比手动设置所有属性要简单得多。
Marc Attinasi

这个扩展曾经非常适合我,但是在Xcode 11中,它使我的应用程序崩溃了let nsRange = NSRange(range,in:valueString)
卢卡斯·P,

9

雨燕2.0

这是一个示例:

let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString

斯威夫特5.x

let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString

要么

let stringAttributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 17.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.orangeColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 2.0]
let atrributedString = NSAttributedString(string: "Sample String: Attributed", attributes: stringAttributes)
sampleLabel.attributedText = atrributedString

8

在Beta 6中运作良好

let attrString = NSAttributedString(
    string: "title-title-title",
    attributes: NSDictionary(
       object: NSFont(name: "Arial", size: 12.0), 
       forKey: NSFontAttributeName))

7

我创建了一个在线工具来解决您的问题!您可以编写字符串并以图形方式应用样式,该工具为您提供了Objective-C和快速的代码来生成该字符串。

也是开源的,因此可以随意扩展它并发送PR。

变压器工具

Github

在此处输入图片说明


不为我工作。它只是将所有内容包装在方括号中,而不应用任何样式。
丹尼尔·斯普林格

5
func decorateText(sub:String, des:String)->NSAttributedString{
    let textAttributesOne = [NSAttributedStringKey.foregroundColor: UIColor.darkText, NSAttributedStringKey.font: UIFont(name: "PTSans-Bold", size: 17.0)!]
    let textAttributesTwo = [NSAttributedStringKey.foregroundColor: UIColor.black, NSAttributedStringKey.font: UIFont(name: "PTSans-Regular", size: 14.0)!]

    let textPartOne = NSMutableAttributedString(string: sub, attributes: textAttributesOne)
    let textPartTwo = NSMutableAttributedString(string: des, attributes: textAttributesTwo)

    let textCombination = NSMutableAttributedString()
    textCombination.append(textPartOne)
    textCombination.append(textPartTwo)
    return textCombination
}

//实施

cell.lblFrom.attributedText = decorateText(sub: sender!, des: " - \(convertDateFormatShort3(myDateString: datetime!))")

5

Swift 5以上

   let attributedString = NSAttributedString(string:"targetString",
                                   attributes:[NSAttributedString.Key.foregroundColor: UIColor.lightGray,
                                               NSAttributedString.Key.font: UIFont(name: "Arial", size: 18.0) as Any])

4

斯威夫特4

let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]

let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)

您需要在Swift 4中删除原始值


3

对我来说,上述解决方案在设置特定颜色或属性时不起作用。

这确实有效:

let attributes = [
    NSFontAttributeName : UIFont(name: "Helvetica Neue", size: 12.0)!,
    NSUnderlineStyleAttributeName : 1,
    NSForegroundColorAttributeName : UIColor.darkGrayColor(),
    NSTextEffectAttributeName : NSTextEffectLetterpressStyle,
    NSStrokeWidthAttributeName : 3.0]

var atriString = NSAttributedString(string: "My Attributed String", attributes: attributes)

3

Swift 2.1-Xcode 7

let labelFont = UIFont(name: "HelveticaNeue-Bold", size: 18)
let attributes :[String:AnyObject] = [NSFontAttributeName : labelFont!]
let attrString = NSAttributedString(string:"foo", attributes: attributes)
myLabel.attributedText = attrString

Swift 2.0和2.1之间进行了哪些更改?
Suragch 2015年

3

使用此示例代码。这是很短的代码,可以满足您的要求。这对我有用。

let attributes = [NSAttributedStringKey.font : UIFont(name: CustomFont.NAME_REGULAR.rawValue, size: CustomFontSize.SURVEY_FORM_LABEL_SIZE.rawValue)!]

let attributedString : NSAttributedString = NSAttributedString(string: messageString, attributes: attributes)

2
extension UILabel{
    func setSubTextColor(pSubString : String, pColor : UIColor){    
        let attributedString: NSMutableAttributedString = self.attributedText != nil ? NSMutableAttributedString(attributedString: self.attributedText!) : NSMutableAttributedString(string: self.text!);

        let range = attributedString.mutableString.range(of: pSubString, options:NSString.CompareOptions.caseInsensitive)
        if range.location != NSNotFound {
            attributedString.addAttribute(NSForegroundColorAttributeName, value: pColor, range: range);
        }
        self.attributedText = attributedString
    }
}

cell.IBLabelGuestAppointmentTime.text =“ \ n \ nGuest1 \ n8:00 am \ n \ nGuest2 \ n9:00Am \ n \ n” cell.IBLabelGuestAppointmentTime.setSubTextColor(pSubString:“ Guest1”,pColor:UIColor.white)cell.IBLabelGuestAppointmentTime .setSubTextColor(pSubString:“ Guest2”,pColor:UIColor.red)
Dipak Panchasara

1
欢迎来到SO。请格式化您的代码,并在答案中添加一些解释/上下文。请参阅:stackoverflow.com/help/how-to-answer
Uwe Allner '16

2

可以直接在3中快速设置属性...

    let attributes = NSAttributedString(string: "String", attributes: [NSFontAttributeName : UIFont(name: "AvenirNext-Medium", size: 30)!,
         NSForegroundColorAttributeName : UIColor .white,
         NSTextEffectAttributeName : NSTextEffectLetterpressStyle])

然后在具有属性的任何类中使用变量


2

斯威夫特4.2

extension UILabel {

    func boldSubstring(_ substr: String) {
        guard substr.isEmpty == false,
            let text = attributedText,
            let range = text.string.range(of: substr, options: .caseInsensitive) else {
                return
        }
        let attr = NSMutableAttributedString(attributedString: text)
        let start = text.string.distance(from: text.string.startIndex, to: range.lowerBound)
        let length = text.string.distance(from: range.lowerBound, to: range.upperBound)
        attr.addAttributes([NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: self.font.pointSize)],
                           range: NSMakeRange(start, length))
        attributedText = attr
    }
}

为什么不简单地用range.count来计算长度呢?
Leo Dabus

2

细节

  • Swift 5.2,Xcode 11.4(11E146)

protocol AttributedStringComponent {
    var text: String { get }
    func getAttributes() -> [NSAttributedString.Key: Any]?
}

// MARK: String extensions

extension String: AttributedStringComponent {
    var text: String { self }
    func getAttributes() -> [NSAttributedString.Key: Any]? { return nil }
}

extension String {
    func toAttributed(with attributes: [NSAttributedString.Key: Any]?) -> NSAttributedString {
        .init(string: self, attributes: attributes)
    }
}

// MARK: NSAttributedString extensions

extension NSAttributedString: AttributedStringComponent {
    var text: String { string }

    func getAttributes() -> [Key: Any]? {
        if string.isEmpty { return nil }
        var range = NSRange(location: 0, length: string.count)
        return attributes(at: 0, effectiveRange: &range)
    }
}

extension NSAttributedString {

    convenience init?(from attributedStringComponents: [AttributedStringComponent],
                      defaultAttributes: [NSAttributedString.Key: Any],
                      joinedSeparator: String = " ") {
        switch attributedStringComponents.count {
        case 0: return nil
        default:
            var joinedString = ""
            typealias SttributedStringComponentDescriptor = ([NSAttributedString.Key: Any], NSRange)
            let sttributedStringComponents = attributedStringComponents.enumerated().flatMap { (index, component) -> [SttributedStringComponentDescriptor] in
                var components = [SttributedStringComponentDescriptor]()
                if index != 0 {
                    components.append((defaultAttributes,
                                       NSRange(location: joinedString.count, length: joinedSeparator.count)))
                    joinedString += joinedSeparator
                }
                components.append((component.getAttributes() ?? defaultAttributes,
                                   NSRange(location: joinedString.count, length: component.text.count)))
                joinedString += component.text
                return components
            }

            let attributedString = NSMutableAttributedString(string: joinedString)
            sttributedStringComponents.forEach { attributedString.addAttributes($0, range: $1) }
            self.init(attributedString: attributedString)
        }
    }
}

用法

let defaultAttributes = [
    .font: UIFont.systemFont(ofSize: 16, weight: .regular),
    .foregroundColor: UIColor.blue
] as [NSAttributedString.Key : Any]

let marketingAttributes = [
    .font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
    .foregroundColor: UIColor.black
] as [NSAttributedString.Key : Any]

let attributedStringComponents = [
    "pay for",
    NSAttributedString(string: "one",
                       attributes: marketingAttributes),
    "and get",
    "three!\n".toAttributed(with: marketingAttributes),
    "Only today!".toAttributed(with: [
        .font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
        .foregroundColor: UIColor.red
    ])
] as [AttributedStringComponent]
let attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)

完整的例子

不要忘记在此处粘贴解决方案代码

import UIKit

class ViewController: UIViewController {

    private weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        let label = UILabel(frame: .init(x: 40, y: 40, width: 300, height: 80))
        label.numberOfLines = 2
        view.addSubview(label)
        self.label = label

        let defaultAttributes = [
            .font: UIFont.systemFont(ofSize: 16, weight: .regular),
            .foregroundColor: UIColor.blue
        ] as [NSAttributedString.Key : Any]

        let marketingAttributes = [
            .font: UIFont.systemFont(ofSize: 20.0, weight: .bold),
            .foregroundColor: UIColor.black
        ] as [NSAttributedString.Key : Any]

        let attributedStringComponents = [
            "pay for",
            NSAttributedString(string: "one",
                               attributes: marketingAttributes),
            "and get",
            "three!\n".toAttributed(with: marketingAttributes),
            "Only today!".toAttributed(with: [
                .font: UIFont.systemFont(ofSize: 16.0, weight: .bold),
                .foregroundColor: UIColor.red
            ])
        ] as [AttributedStringComponent]
        label.attributedText = NSAttributedString(from: attributedStringComponents, defaultAttributes: defaultAttributes)
        label.textAlignment = .center
    }
}

结果

在此处输入图片说明


1

使用我创建的库很容易解决您的问题。它称为Atributika。

let calculatedCoffee: Int = 768
let g = Style("g").font(.boldSystemFont(ofSize: 12)).foregroundColor(.red)
let all = Style.font(.systemFont(ofSize: 12))

let str = "\(calculatedCoffee)<g>g</g>".style(tags: g)
    .styleAll(all)
    .attributedString

label.attributedText = str

768克

您可以在这里找到它https://github.com/psharanda/Atributika



1

Swifter Swift有一种非常不错的方法,无需任何工作即可完成。只需提供应该匹配的模式以及要应用的属性即可。他们在很多方面都很出色,请检查一下。

``` Swift
let defaultGenreText = NSAttributedString(string: "Select Genre - Required")
let redGenreText = defaultGenreText.applying(attributes: [NSAttributedString.Key.foregroundColor : UIColor.red], toRangesMatching: "Required")
``

如果您有多个应用此方法的地方,而您只希望它在特定实例中发生,那么此方法将行不通。

您可以一步完成此操作,分开后更容易阅读。


0

斯威夫特4.x

let attr = [NSForegroundColorAttributeName:self.configuration.settingsColor, NSFontAttributeName: self.configuration.settingsFont]

let title = NSAttributedString(string: self.configuration.settingsTitle,
                               attributes: attr)

0

Swift 3.0 //创建属性字符串

定义属性,例如

let attributes = [NSAttributedStringKey.font : UIFont.init(name: "Avenir-Medium", size: 13.0)]

0

请考虑使用Prestyler

import Prestyler
...
Prestyle.defineRule("$", UIColor.red)
label.attributedText = "\(calculatedCoffee) $g$".prestyled()

0

斯威夫特5

    let attrStri = NSMutableAttributedString.init(string:"This is red")
    let nsRange = NSString(string: "This is red").range(of: "red", options: String.CompareOptions.caseInsensitive)
    attrStri.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.red, NSAttributedString.Key.font: UIFont.init(name: "PTSans-Regular", size: 15.0) as Any], range: nsRange)
    self.label.attributedText = attrStri

在此处输入图片说明


-4
extension String {
//MARK: Getting customized string
struct StringAttribute {
    var fontName = "HelveticaNeue-Bold"
    var fontSize: CGFloat?
    var initialIndexOftheText = 0
    var lastIndexOftheText: Int?
    var textColor: UIColor = .black
    var backGroundColor: UIColor = .clear
    var underLineStyle: NSUnderlineStyle = .styleNone
    var textShadow: TextShadow = TextShadow()

    var fontOfText: UIFont {
        if let font = UIFont(name: fontName, size: fontSize!) {
            return font
        } else {
            return UIFont(name: "HelveticaNeue-Bold", size: fontSize!)!
        }
    }

    struct TextShadow {
        var shadowBlurRadius = 0
        var shadowOffsetSize = CGSize(width: 0, height: 0)
        var shadowColor: UIColor = .clear
    }
}
func getFontifiedText(partOfTheStringNeedToConvert partTexts: [StringAttribute]) -> NSAttributedString {
    let fontChangedtext = NSMutableAttributedString(string: self, attributes: [NSFontAttributeName: UIFont(name: "HelveticaNeue-Bold", size: (partTexts.first?.fontSize)!)!])
    for eachPartText in partTexts {
        let lastIndex = eachPartText.lastIndexOftheText ?? self.count
        let attrs = [NSFontAttributeName : eachPartText.fontOfText, NSForegroundColorAttributeName: eachPartText.textColor, NSBackgroundColorAttributeName: eachPartText.backGroundColor, NSUnderlineStyleAttributeName: eachPartText.underLineStyle, NSShadowAttributeName: eachPartText.textShadow ] as [String : Any]
        let range = NSRange(location: eachPartText.initialIndexOftheText, length: lastIndex - eachPartText.initialIndexOftheText)
        fontChangedtext.addAttributes(attrs, range: range)
    }
    return fontChangedtext
}

}

//使用如下

    let someAttributedText = "Some   Text".getFontifiedText(partOfTheStringNeedToConvert: <#T##[String.StringAttribute]#>)

2
这个答案告诉您所有您需要了解的内容,除了如何快速创建属性字符串。
埃里克(Eric)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.