我如何使一个带属性的字符串使用Swift?

我正在尝试做一个简单的咖啡计算器。我需要以克为单位显示咖啡量。“g”符号的克需要附加到我的UILabel,我正在使用显示金额。UILabel中的数字随着用户输入而动态变化,但我需要在字符串末尾添加一个小写“g”,它的格式与更新的数字不同。“g”需要附加到数字上,以便随着数字大小和位置的变化,“g”也会随着数字“移动”。我相信这个问题之前已经解决了,所以在正确的方向上的链接将是有帮助的,因为我已经谷歌了我的小心脏。

我已经通过文档搜索了带属性字符串,我甚至从应用商店下载了“带属性字符串创建者”,但结果代码是在Objective-C中,我使用的是Swift。在Swift中使用带属性的字符串创建带有自定义属性的自定义字体,这是一个很好的例子,可能对其他学习这门语言的开发人员很有帮助。这个文档是非常令人困惑的,因为没有一个非常明确的路径如何这样做。我的计划是创建带属性的字符串,并将其添加到coffeeAmount字符串的末尾。

var coffeeAmount: String = calculatedCoffee + attributedText

其中calculatedCoffee是一个Int转换为字符串和“attributedText”是小写的“g”与自定义字体,我试图创建。也许我做错了。任何帮助都是感激的!

398059 次浏览

Swift使用与Obj-C相同的NSMutableAttributedString。你通过传入计算值作为字符串来实例化它:

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

在beta 6中工作良好

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

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])

Swift: xcode 6.1

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


let attrString = NSAttributedString(
string: titleData,
attributes: NSDictionary(
object: font!,
forKey: NSFontAttributeName))
 let attrString = NSAttributedString (
string: "title-title-title",
attributes: [NSAttributedStringKey.foregroundColor: UIColor.black])

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

这招确实管用:

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)

enter image description here

这个答案已经在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

Text Color

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

Background Color

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

Font

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

enter image description here

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

enter image description here

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,值:UIFont
  • 键名:NSAttributedString.Key.foregroundColor,值:UIColor
  • 键名:NSAttributedString.Key.link,值:NSURLNSString

还有很多其他的。更多信息请参见这个链接。你甚至可以创建自己的自定义属性,比如:

  • 键名:NSAttributedString.Key.myName,值:some类型 如果你创建扩展:

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

Creating attributes in Swift

You can declare attributes just like declaring any other dictionary.

// 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

结果如下:

enter image description here

然后附加另一个没有设置任何属性的带属性字符串。(请注意,即使我在上面使用let来声明myString,我仍然可以修改它,因为它是NSMutableAttributedString。对我来说,这似乎不太像斯威夫特,如果将来这种情况发生变化,我也不会感到惊讶。如果发生这种情况,请给我留言。)

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

enter image description here

接下来,我们只选择“Strings”字,它从索引17开始,长度为7。注意,这是一个NSRange,而不是Swift的Range。(有关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)

enter image description here

最后,让我们添加一个背景色。为了多样化,让我们使用addAttributes方法(注意s)。我可以使用这个方法一次添加多个属性,但我将再次添加一个属性。

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

enter image description here

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

相关的

进一步的阅读

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

< em >迅速2.0 < / em >

下面是一个例子:

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.倍

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
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
}
}

我强烈建议使用带属性字符串的库。例如,当你想要一个有四种不同颜色和四种不同字体的字符串时,它使更容易。这是我最喜欢的。它叫做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将显示为

显示为图像

用我创建的库来解决您的问题将非常容易。它被称为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

768g

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

属性可以直接设置在swift 3…

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

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

斯威夫特4:

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

我创建了一个在线工具来解决你的问题!你可以编写字符串并以图形化的方式应用样式,该工具会给你objective-c和swift代码来生成字符串。

Also是开源的,所以请随意扩展它并发送pr。

< a href = " https://andresinaka.github。io/Transformer/" rel="noreferrer">Transformer Tool . io/Transformer/" rel="noreferrer

Github

enter image description here

在iOS上处理attributedstring的最好方法是使用接口构建器中内置的attributedtext编辑器,避免在源文件中不必要的硬编码NSAtrributedStringKeys。

你可以使用这个扩展在运行时动态替换占位符:

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
}
}

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

enter image description here

然后你只需在你需要的时候更新这个值,就像这样:

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

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

你可以通过阅读这篇文章来更好地理解这种方法: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e < / p >
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]#>)
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!))")

斯威夫特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中删除原始值

斯威夫特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
}
}

快4.倍

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


let title = NSAttributedString(string: self.configuration.settingsTitle,
attributes: attr)
< p > 3.0 //创建带属性的字符串

定义如下属性

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

请考虑使用Prestyler

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

Swift 5及以上

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

更快迅速有一个很好的方法来做到这一点,没有任何工作。只需提供应该匹配的模式以及应用于它的属性。它们在很多方面都很有用,去看看吧。

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

如果你有多个地方,这将被应用,你只希望它发生在特定的实例,那么这个方法将不起作用。

你可以一步完成,只是分开时更容易阅读。

使用这个示例代码。这是满足您需求的非常短的代码。这对我很有用。

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 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
}
}

结果

enter image description here

斯威夫特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

enter image description here

我做了一个函数,它接受字符串数组并返回带有您所给属性的由于字符串

func createAttributedString(stringArray: [String], attributedPart: Int, attributes: [NSAttributedString.Key: Any]) -> NSMutableAttributedString? {
let finalString = NSMutableAttributedString()
for i in 0 ..< stringArray.count {
var attributedString = NSMutableAttributedString(string: stringArray[i], attributes: nil)
if i == attributedPart {
attributedString = NSMutableAttributedString(string: attributedString.string, attributes: attributes)
finalString.append(attributedString)
} else {
finalString.append(attributedString)
}
}
return finalString
}

在上面的例子中,你指定了字符串的哪一部分你想用attributedPart: Int来赋属性

然后你给它的属性 属性:【NSAttributedString。关键:任何]< / >强

使用的例子

if let attributedString = createAttributedString(stringArray: ["Hello ", "how ", " are you?"], attributedPart: 2, attributes: [NSAttributedString.Key.foregroundColor: UIColor.systemYellow]) {
myLabel.attributedText = attributedString
}

会做的事:

Objective-C 2.0示例:

myUILabel.text = @"€ 60,00";
NSMutableAttributedString *amountText = [[NSMutableAttributedString alloc] initWithString:myUILabel.text];


//Add attributes you are looking for
NSDictionary *dictionaryOfAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont systemFontOfSize:12],NSFontAttributeName,
[UIColor grayColor],NSForegroundColorAttributeName,
nil];


//Will gray color and resize the € symbol
[amountText setAttributes:dictionaryOfAttributes range:NSMakeRange(0, 1)];
myUILabel.attributedText = amountText;

斯威夫特3、4、5所示

使用下面的代码为文本颜色,字体,背景颜色和下划线/下划线颜色

    let text = "swift is language"
let attributes = [NSAttributedString.Key.foregroundColor: UIColor.red, NSAttributedString.Key.backgroundColor: UIColor.blue,NSAttributedString.Key.font: UIFont.systemFont(ofSize: 25.0),NSAttributedString.Key.underlineColor: UIColor.white,NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue] as [NSAttributedString.Key : Any]
        

let textAttribute = NSAttributedString(string: text, attributes: attributes)
swiftLabel1.attributedText = textAttribute

enter image description here