如何使用Swift创build一个属性string?
我正在尝试制作一个简单的咖啡计算器。 我需要以克为单位显示咖啡的数量。 克的“g”符号需要附加到我用来显示金额的UILabel。 在UILabel中的数字正在dynamic改变与用户input就好了,但我需要在格式不同于更新数字的string的末尾添加一个小写字母“g”。 “g”需要附在数字上,以便随着号码大小和位置的变化,“g”会随着数字“移动”。 我确信这个问题已经解决了,所以一个正确的方向的链接将是有益的,因为我一直在寻找我的小心脏。
我search了一个属性string的文档,我甚至从app store中下载了“Attributed String Creator”,但是生成的代码是在Objective-C中,而我正在使用Swift。 对于学习这种语言的其他开发者来说,什么是可怕的,并且可能是有帮助的,这是一个使用Swift中的属性string创build具有自定义属性的自定义字体的明显例子。 这方面的文件非常混乱,因为在这方面没有一个非常清晰的path。 我的计划是创build属性string,并将其添加到我的coffeeAmountstring的末尾。
var coffeeAmount: String = calculatedCoffee + attributedText
其中calculatedCoffee是一个Int转换为一个string和“JavasText”是小写“g”与我想创build的自定义字体。 也许我正在做这个错误的方式。 任何帮助表示赞赏!
这个答案已经更新了Swift 3.0。
快速参考
制作和设置属性string的一般forms就是这样。 您可以在下面find其他常用选项。
// create attributed string let myString = "Swift Attributed String" let myAttribute = [ NSForegroundColorAttributeName: UIColor.blue ] let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) // set attributed text on a UILabel myLabel.attributedText = myAttrString
let myAttribute = [ NSForegroundColorAttributeName: UIColor.blue ]
let myAttribute = [ NSBackgroundColorAttributeName: UIColor.yellow ]
let myAttribute = [ NSFontAttributeName: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue ]
let myShadow = NSShadow() myShadow.shadowBlurRadius = 3 myShadow.shadowOffset = CGSize(width: 3, height: 3) myShadow.shadowColor = UIColor.gray let myAttribute = [ NSShadowAttributeName: myShadow ]
这篇文章的其余部分给那些有兴趣的人提供了更多的细节。
属性
string属性只是一个[String: Any]
forms的字典,其中String
是属性的键名, Any
是某个Type的值。 值可以是字体,颜色,整数或其他。 Swift中有很多已经预定义的标准属性。 例如:
- 键名:
NSFontAttributeName
,值:一个UIFont
- 键名:
NSForegroundColorAttributeName
,值:一个UIColor
- 键名:
NSLinkAttributeName
,值:NSURL
或String
还有很多其他的。 看到这个链接更多。 你甚至可以制作自己的自定义属性。
- 键名:
MyCustomAttributeName
,值:一些types。
在Swift中创build属性
您可以像声明任何其他字典一样声明属性。
// single attributes declared one at a time let singleAttribute1 = [ NSForegroundColorAttributeName: UIColor.green ] let singleAttribute2 = [ NSBackgroundColorAttributeName: UIColor.yellow ] let singleAttribute3 = [ NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue ] // multiple attributes declared at once let multipleAttributes: [String : Any] = [ NSForegroundColorAttributeName: UIColor.green, NSBackgroundColorAttributeName: UIColor.yellow, NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue ] // custom attribute let customAttribute = [ "MyCustomAttributeName": "Some value" ]
请注意下划线样式值所需的rawValue
。
由于属性只是字典,您也可以通过创build一个空的字典,然后添加键值对来创build它们。 如果该值将包含多个types,则必须使用Any
作为types。 这里是上面的multipleAttributes
例子,以这种方式重新创build:
var multipleAttributes = [String : Any]() multipleAttributes[NSForegroundColorAttributeName] = UIColor.green multipleAttributes[NSBackgroundColorAttributeName] = UIColor.yellow multipleAttributes[NSUnderlineStyleAttributeName] = NSUnderlineStyle.styleDouble.rawValue
属性string
现在您已经了解了属性,您可以创build属性string。
初始化
有几种方法可以创build属性string。 如果你只需要一个只读string,你可以使用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: ["MyCustomAttribute": "A value"]) // Initialize with a string and separately declared attribute(s) let myAttributes1 = [ NSForegroundColorAttributeName: UIColor.green ] let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
如果以后需要更改属性或string内容,则应该使用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: ["MyCustomAttribute": "A value"]) // Initialize with a string and separately declared attribute(s) let myAttributes2 = [ NSForegroundColorAttributeName: UIColor.green ] let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)
更改属性string
作为一个例子,我们来创build这个post顶部的属性string。
首先用一个新的字体属性创build一个NSMutableAttributedString
。
let myAttribute = [ NSFontAttributeName: UIFont(name: "Chalkduster", size: 18.0)! ] let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
如果你一直在工作,像这样设置属性的string到UITextView
(或UILabel
):
textView.attributedText = myString
你不使用textView.text
。
结果如下:
然后附加另一个没有设置任何属性的属性string。 (请注意,即使我使用let
声明上面的myString
,我仍然可以修改它,因为它是一个NSMutableAttributedString
。这对我来说似乎相当不太喜欢,如果将来会发生变化,我不会感到惊讶。发生。)
let attrString = NSAttributedString(string: " Attributed Strings") myString.append(attrString)
接下来,我们将只select“string”字,它从索引17
开始,长度为7
。 注意这是一个NSRange
而不是Swift Range
。 (有关范围的更多信息,请参阅此答案 。) addAttribute
方法让我们将属性键名称放在第一个位置,第二个位置的属性值和第三个位置的范围。
var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings" myString.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: myRange)
最后,我们添加一个背景颜色。 为了多样化,我们使用addAttributes
方法(注意s
)。 我可以用这个方法一次添加多个属性,但是我只是再添加一个属性。
myRange = NSRange(location: 3, length: 17) let anotherAttribute = [ NSBackgroundColorAttributeName: UIColor.yellow ] myString.addAttributes(anotherAttribute, range: myRange)
注意这些属性在一些地方是重叠的。 添加属性不会覆盖已经存在的属性。
有关
- 如何更改
NSMutableAttributedString
的文本,但保留属性
进一步阅读
- 如何从水龙头位置检索属性
- “属性string编程指南” (非常简单,但不幸的是只在Objective-C中)
Swift使用Obj-C所使用的相同的NSMutableAttributedString
。 通过以stringforms传递计算值来实例化它:
var attributedString = NSMutableAttributedString(string:"\(calculatedCoffee)")
现在创build归属的g
string(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
Swift:xcode 6.1
let font:UIFont? = UIFont(name: "Arial", size: 12.0) let attrString = NSAttributedString( string: titleData, attributes: NSDictionary( object: font!, forKey: NSFontAttributeName))
在testing版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])
我强烈build议使用属性string库。 这使得它更容易,例如,一个具有四种不同颜色和四种不同字体的string。 这是我的最爱。 它被称为SwiftyAttributes
如果您想使用SwiftyAttributes制作四种不同颜色和不同字体的string:
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
会显示为
Swift 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
要么
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
Swift 4:
let attributes = [NSAttributedStringKey.font: UIFont(name: "HelveticaNeue-Bold", size: 17)!, NSAttributedStringKey.foregroundColor: UIColor.white]
对于我来说,上面的解决scheme在设置特定的颜色或属性时不起作用。
这确实工作:
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)
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
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 } }
let attrString = NSAttributedString ( string: "title-title-title", attributes: [NSForegroundColorAttributeName: UIColor.blackColor()])
用我创build的库来解决你的问题真的很容易。 它被称为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
你可以在这里findhttps://github.com/psharanda/Atributika
属性可以直接在swift中设置3 …
let attributes = NSAttributedString(string: "String", attributes: [NSFontAttributeName : UIFont(name: "AvenirNext-Medium", size: 30)!, NSForegroundColorAttributeName : UIColor .white, NSTextEffectAttributeName : NSTextEffectLetterpressStyle])
然后在任何具有属性的类中使用该variables