ios 在 Swift 中使用 NSMutableAttributedString 更改特定文本的颜色
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25207373/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Changing specific text's color using NSMutableAttributedString in Swift
提问by richyrich24
The issue I am having is that I want to be able to change the textColor of certain text in a TextView. I am using a concatenated string, and just want the strings I am appending into the TextView's text. It appears that what I want to use is NSMutableAttributedString
, but I am not finding any resources of how to use this in Swift. What I have so far is something like this:
我遇到的问题是我希望能够更改 TextView 中某些文本的 textColor。我正在使用连接字符串,并且只想要我附加到 TextView 文本中的字符串。看来我想要使用的是NSMutableAttributedString
,但我没有找到有关如何在 Swift 中使用它的任何资源。到目前为止,我所拥有的是这样的:
let string = "A \(stringOne) with \(stringTwo)"
var attributedString = NSMutableAttributedString(string: string)
textView.attributedText = attributedString
From here I know I need to find the range of words that need to have their textColor changed and then add them to the attributed string. What I need to know is how to find the correct strings from the attributedString, and then change their textColor.
从这里我知道我需要找到需要更改 textColor 的单词范围,然后将它们添加到属性字符串中。我需要知道的是如何从attributedString 中找到正确的字符串,然后更改它们的textColor。
Since I have too low of a rating I can't answer my own question, but here is the answer I found
由于我的评分太低,我无法回答我自己的问题,但这是我找到的答案
I found my own answer by translating from translating some code from
我通过翻译一些代码找到了自己的答案
Change attributes of substrings in a NSAttributedString
更改 NSAttributedString 中子字符串的属性
Here is the example of implementation in Swift:
这是在 Swift 中的实现示例:
let string = "A \(stringOne) and \(stringTwo)"
var attributedString = NSMutableAttributedString(string:string)
let stringOneRegex = NSRegularExpression(pattern: nameString, options: nil, error: nil)
let stringOneMatches = stringOneRegex.matchesInString(longString, options: nil, range: NSMakeRange(0, attributedString.length))
for stringOneMatch in stringOneMatches {
let wordRange = stringOneMatch.rangeAtIndex(0)
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.nameColor(), range: wordRange)
}
textView.attributedText = attributedString
Since I am wanting to change the textColor of multiple Strings I will make a helper function to handle this, but this works for changing the textColor.
由于我想更改多个字符串的 textColor,因此我将创建一个辅助函数来处理此问题,但这适用于更改 textColor。
回答by james_alvarez
I see you have answered the question somewhat, but to provide a slightly more concise way without using regex to answer to the title question:
我看到你已经回答了这个问题,但提供一种更简洁的方式,而不使用正则表达式来回答标题问题:
To change the colour of a length of text you need to know the start and end index of the coloured-to-be characters in the string e.g.
要更改一段文本的颜色,您需要知道字符串中待着色字符的开始和结束索引,例如
var main_string = "Hello World"
var string_to_color = "World"
var range = (main_string as NSString).rangeOfString(string_to_color)
Then you convert to attributed string and use 'add attribute' with NSForegroundColorAttributeName:
然后转换为属性字符串并使用带有 NSForegroundColorAttributeName 的“添加属性”:
var attributedString = NSMutableAttributedString(string:main_string)
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)
A list of further standard attributes you can set can be found in Apple's documentation
您可以在Apple 的文档中找到您可以设置的更多标准属性的列表
回答by Kishore Kumar
SWIFT 5
快速 5
let main_string = "Hello World"
let string_to_color = "World"
let range = (main_string as NSString).range(of: string_to_color)
let attribute = NSMutableAttributedString.init(string: main_string)
attribute.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red , range: range)
txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
txtfield1.attributedText = attribute
SWIFT 4.2
斯威夫特 4.2
let txtfield1 :UITextField!
let main_string = "Hello World"
let string_to_color = "World"
let range = (main_string as NSString).range(of: string_to_color)
let attribute = NSMutableAttributedString.init(string: main_string)
attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red , range: range)
txtfield1 = UITextField.init(frame:CGRect(x:10 , y:20 ,width:100 , height:100))
txtfield1.attributedText = attribute
回答by Chris
Swift 2.1 Update:
斯威夫特 2.1 更新:
let text = "We tried to make this app as most intuitive as possible for you. If you have any questions don't hesitate to ask us. For a detailed manual just click here."
let linkTextWithColor = "click here"
let range = (text as NSString).rangeOfString(linkTextWithColor)
let attributedString = NSMutableAttributedString(string:text)
attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor() , range: range)
self.helpText.attributedText = attributedString
self.helpText
is a UILabel
outlet.
self.helpText
是一个UILabel
出口。
回答by Doci
Swift 4.2and Swift 5colorise parts of the string.
Swift 4.2和Swift 5为字符串的部分着色。
A very easy way to use NSMutableAttributedString while extending the String. This also can be used to colourize more than one word in the whole string.
在扩展字符串时使用 NSMutableAttributedString 的一种非常简单的方法。这也可用于为整个字符串中的多个单词着色。
Add new file for extensions, File -> New -> Swift File with name for ex. "NSAttributedString+TextColouring" and add the code
为扩展添加新文件,File -> New -> Swift File with name for ex。“NSAttributedString+TextColouring”并添加代码
import UIKit
extension String {
func attributedStringWithColor(_ strings: [String], color: UIColor, characterSpacing: UInt? = nil) -> NSAttributedString {
let attributedString = NSMutableAttributedString(string: self)
for string in strings {
let range = (self as NSString).range(of: string)
attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: range)
}
guard let characterSpacing = characterSpacing else {return attributedString}
attributedString.addAttribute(NSAttributedString.Key.kern, value: characterSpacing, range: NSRange(location: 0, length: attributedString.length))
return attributedString
}
}
Now you can use globally at any viewcontroller you want:
现在你可以在任何你想要的视图控制器上全局使用:
let attributedWithTextColor: NSAttributedString = "Doc, welcome back :)".attributedStringWithColor(["Doc", "back"], color: UIColor.black)
myLabel.attributedText = attributedWithTextColor
回答by Anurag Sharma
Answer is already given in previous posts but i have a different way of doing this
以前的帖子中已经给出了答案,但我有不同的方法来做到这一点
Swift 3x :
斯威夫特 3 倍:
var myMutableString = NSMutableAttributedString()
myMutableString = NSMutableAttributedString(string: "Your full label textString")
myMutableString.setAttributes([NSFontAttributeName : UIFont(name: "HelveticaNeue-Light", size: CGFloat(17.0))!
, NSForegroundColorAttributeName : UIColor(red: 232 / 255.0, green: 117 / 255.0, blue: 40 / 255.0, alpha: 1.0)], range: NSRange(location:12,length:8)) // What ever range you want to give
yourLabel.attributedText = myMutableString
Hope this helps anybody!
希望这可以帮助任何人!
回答by ghostatron
Chris' answer was a great help to me, so I used his approach and turned into a func that I can reuse. This let's me assign a color to a substring while giving the rest of the string another color.
Chris 的回答对我帮助很大,所以我使用了他的方法并变成了一个我可以重用的 func。这让我为子字符串分配一种颜色,同时为字符串的其余部分提供另一种颜色。
static func createAttributedString(fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) -> NSMutableAttributedString
{
let range = (fullString as NSString).rangeOfString(subString)
let attributedString = NSMutableAttributedString(string:fullString)
attributedString.addAttribute(NSForegroundColorAttributeName, value: fullStringColor, range: NSRange(location: 0, length: fullString.characters.count))
attributedString.addAttribute(NSForegroundColorAttributeName, value: subStringColor, range: range)
return attributedString
}
回答by Amr Angry
You can use this extension I test it over
你可以使用我测试过的这个扩展
swift 4.2
快速 4.2
import Foundation
import UIKit
extension NSMutableAttributedString {
convenience init (fullString: String, fullStringColor: UIColor, subString: String, subStringColor: UIColor) {
let rangeOfSubString = (fullString as NSString).range(of: subString)
let rangeOfFullString = NSRange(location: 0, length: fullString.count)//fullString.range(of: fullString)
let attributedString = NSMutableAttributedString(string:fullString)
attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: fullStringColor, range: rangeOfFullString)
attributedString.addAttribute(NSAttributedStringKey.foregroundColor, value: subStringColor, range: rangeOfSubString)
self.init(attributedString: attributedString)
}
}
回答by swift2geek
Swift 4.1
斯威夫特 4.1
NSAttributedStringKey.foregroundColor
for example if you want to change font in NavBar:
例如,如果您想更改 NavBar 中的字体:
self.navigationController?.navigationBar.titleTextAttributes = [ NSAttributedStringKey.font: UIFont.systemFont(ofSize: 22), NSAttributedStringKey.foregroundColor: UIColor.white]
回答by niravdesai21
Swift 4.1
斯威夫特 4.1
I have changed from this In Swift 3
我已经从这个 In Swift 3 改变了
let str = "Welcome "
let welcomeAttribute = [ NSForegroundColorAttributeName: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)
And this in Swift 4.0
这在 Swift 4.0 中
let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey.foregroundColor: UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)
to Swift 4.1
到Swift 4.1
let str = "Welcome "
let welcomeAttribute = [ NSAttributedStringKey(rawValue: NSForegroundColorAttributeName): UIColor.blue()]
let welcomeAttrString = NSMutableAttributedString(string: str, attributes: welcomeAttribute)
Works fine
工作正常
回答by Sarabjit Singh
Swift 2.2
斯威夫特 2.2
var myMutableString = NSMutableAttributedString()
myMutableString = NSMutableAttributedString(string: "1234567890", attributes: [NSFontAttributeName:UIFont(name: kDefaultFontName, size: 14.0)!])
myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor(red: 0.0/255.0, green: 125.0/255.0, blue: 179.0/255.0, alpha: 1.0), range: NSRange(location:0,length:5))
self.lblPhone.attributedText = myMutableString