该答案已针对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
,值:NSURL
或NSString
还有很多。有关更多信息,请参见此链接。您甚至可以创建自己的自定义属性,例如:
在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
。
结果如下:
然后附加另一个未设置任何属性的属性字符串。(请注意,即使我以前let
在myString
上面声明过,我仍然可以对其进行修改,因为它是一个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)
请注意,属性在某些地方重叠。添加属性不会覆盖已经存在的属性。
有关
进一步阅读
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue