在NSString或nsmutablestring中不可能有多种颜色。我听说过一点NSAttributedString,它是在iPad SDK 3.2(或大约3.2)中引入的,并且在iPhone SDK 4.0 beta版中可用。
我想要一根有三种颜色的绳子。
我不使用3个独立的NSString的原因,是因为三个NSAttributedString子字符串的长度经常改变,所以我宁愿,不使用任何计算重新定位3个独立的NSString对象。
如果使用NSAttributedString是可能的,我怎么做以下-(如果不可能使用NSAttributedString,你会怎么做):
编辑:
记住,@"first", @"second"和@"third"随时会被其他字符串替换。所以使用硬编码的NSRange值是行不通的。
我做了一个库,使这更容易。看看ZenCopy吧。
您可以创建Style对象,和/或将它们设置为稍后引用的键。是这样的:
ZenCopy.manager.config.setStyles {
return [
"token": Style(
color: .blueColor(), // optional
// fontName: "Helvetica", // optional
fontSize: 14 // optional
)
]
}
然后,你可以很容易地构造字符串和样式,并有参数:)
label.attributedText = attributedString(
["$0 ".style("token") "is dancing with ", "$1".style("token")],
args: ["JP", "Brock"]
)
你也可以很容易地用正则表达式搜索样式!
let atUserRegex = "(@[A-Za-z0-9_]*)"
mutableAttributedString.regexFind(atUserRegex, addStyle: "token")
这将使用'token'样式对前面带有'@'的所有单词进行样式化。(例如@jpmcglone)
我需要仍然得到它工作w/一切NSAttributedString所提供的,但我认为fontName, fontSize和颜色涵盖了它的大部分。期待很快会有很多更新:)
如果你需要,我可以帮你开始。同时也在寻求反馈,所以如果它能让你的生活更轻松,我就说任务完成了。
我认为,使用正则表达式来查找应用属性的范围是一种非常方便的方法。我是这样做的:
NSMutableAttributedString *goodText = [[NSMutableAttributedString alloc] initWithString:articleText];
NSRange range = [articleText rangeOfString:@"\\[.+?\\]" options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
[goodText addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia" size:16] range:range];
[goodText addAttribute:NSForegroundColorAttributeName value:[UIColor brownColor] range:range];
}
NSString *regEx = [NSString stringWithFormat:@"%@.+?\\s", [self.article.titleText substringToIndex:0]];
range = [articleText rangeOfString:regEx options:NSRegularExpressionSearch|NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
[goodText addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Georgia-Bold" size:20] range:range];
[goodText addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:range];
}
[self.textView setAttributedText:goodText];
我正在搜索可用属性的列表,但在这里和类引用的第一页中都没有找到它们。所以我决定在这里发布相关信息。
标准属性
带属性字符串支持以下文本的标准属性。如果键不在字典中,则使用下面描述的默认值。
NSString *NSFontAttributeName;
NSString *NSParagraphStyleAttributeName;
NSString *NSForegroundColorAttributeName;
NSString *NSUnderlineStyleAttributeName;
NSString *NSSuperscriptAttributeName;
NSString *NSBackgroundColorAttributeName;
NSString *NSAttachmentAttributeName;
NSString *NSLigatureAttributeName;
NSString *NSBaselineOffsetAttributeName;
NSString *NSKernAttributeName;
NSString *NSLinkAttributeName;
NSString *NSStrokeWidthAttributeName;
NSString *NSStrokeColorAttributeName;
NSString *NSUnderlineColorAttributeName;
NSString *NSStrikethroughStyleAttributeName;
NSString *NSStrikethroughColorAttributeName;
NSString *NSShadowAttributeName;
NSString *NSObliquenessAttributeName;
NSString *NSExpansionAttributeName;
NSString *NSCursorAttributeName;
NSString *NSToolTipAttributeName;
NSString *NSMarkedClauseSegmentAttributeName;
NSString *NSWritingDirectionAttributeName;
NSString *NSVerticalGlyphFormAttributeName;
NSString *NSTextAlternativesAttributeName;
NSAttributedString编程指南
完整的类参考在这里。
在Swift 4中:
let string:NSMutableAttributedString = {
let mutableString = NSMutableAttributedString(string: "firstsecondthird")
mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.red , range: NSRange(location: 0, length: 5))
mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.green , range: NSRange(location: 5, length: 6))
mutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue , range: NSRange(location: 11, length: 5))
return mutableString
}()
print(string)
在构建带属性字符串时,我更喜欢使用可变子类,只是为了让事情更简洁。
话虽如此,下面是如何创建一个三色带属性字符串:
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"firstsecondthird"];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,5)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(5,6)];
[string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(11,5)];
在浏览器中输入。警告实现者
显然你不会像这样硬编码。也许你可以这样做:
NSDictionary *wordToColorMapping = ....; //an NSDictionary of NSString => UIColor pairs
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@""];
for (NSString *word in wordToColorMapping) {
UIColor *color = [wordToColorMapping objectForKey:word];
NSDictionary *attributes = [NSDictionary dictionaryWithObject:color forKey:NSForegroundColorAttributeName];
NSAttributedString *subString = [[NSAttributedString alloc] initWithString:word attributes:attributes];
[string appendAttributedString:subString];
[subString release];
}
//display string