如何使用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 ,值: NSURLString

还有很多其他的。 看到这个链接更多。 你甚至可以制作自己的自定义属性。

  • 键名: 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归属的gstring(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 

768克

你可以在这里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