你如何使用NSAttributedString?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你如何使用NSAttributedString?相关的知识,希望对你有一定的参考价值。
NSString
或NSMutableStrings
中的多种颜色是不可能的。所以我听说过一些关于NSAttributedString
的内容,它是在iPad SDK 3.2(或3.2左右)中引入的,并且可以在iPhone SDK 4.0 beta版的iPhone上获得。
我想要一个有三种颜色的字符串。
我不使用3个单独的NSStrings的原因是因为三个NSAttributedString
子串中的每一个的长度经常变化,所以我更喜欢,不使用任何计算来重新定位3个单独的NSString
对象。
如果可以使用NSAttributedString
,我该如何进行以下操作 - (如果不能使用NSAttributed字符串,你会怎么做):
编辑:请记住,@"first"
,@"second"
和@"third"
将随时被其他字符串替换。因此,使用硬编码的NSRange值将不起作用。
在构建属性字符串时,我更喜欢使用可变子类,只是为了保持清洁。
话虽如此,这里是你如何创建一个三色属性字符串:
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
您可以在html
中加载Swift
属性字符串,如下所示
var Str = NSAttributedString(
data: htmlstring.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true),
options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil,
error: nil)
label.attributedText = Str
从文件加载html
if let rtf = NSBundle.mainBundle().URLForResource("rtfdoc", withExtension: "rtf", subdirectory: nil, localization: nil) {
let attributedString = NSAttributedString(fileURL: rtf, options: [NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType], documentAttributes: nil, error: nil)
textView.attributedText = attributedString
textView.editable = false
}
http://sketchytech.blogspot.in/2013/11/creating-nsattributedstring-from-html.html
并根据您所需的属性设置字符串....按照这个.. http://makeapppie.com/2014/10/20/swift-swift-using-attributed-strings-in-swift/
我创建了一个库,使这更容易。看看ZenCopy.
您可以创建Style对象,和/或将它们设置为键以便稍后引用。像这样:
ZenCopy.manager.config.setStyles {
return [
"token": Style(
color: .blueColor(), // optional
// fontName: "Helvetica", // optional
fontSize: 14 // optional
)
]
}
然后,你可以轻松地构造字符串和样式他们并有params :)
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)
我需要仍然使用NSAttributedString
提供的所有功能,但我认为fontName
,fontSize
和颜色覆盖了它的大部分。期待很快更新:)
如果您需要,我可以帮助您开始使用它。也在寻找反馈,所以如果它让你的生活更轻松,我会说任务完成了。
- (void)changeColorWithString:(UILabel *)uilabel stringToReplace:(NSString *) stringToReplace uiColor:(UIColor *) uiColor{
NSMutableAttributedString *text =
[[NSMutableAttributedString alloc]
initWithAttributedString: uilabel.attributedText];
[text addAttribute: NSForegroundColorAttributeName value:uiColor range:[uilabel.text rangeOfString:stringToReplace]];
[uilabel setAttributedText: text];
}
为了解决这类问题,我在swift中创建了一个名为Atributika的库。
let str = "<r>first</r><g>second</g><b>third</b>".style(tags:
Style("r").foregroundColor(.red),
Style("g").foregroundColor(.green),
Style("b").foregroundColor(.blue)).attributedString
label.attributedText = str
你可以在这里找到https://github.com/psharanda/Atributika
斯威夫特4
let combination = NSMutableAttributedString()
var part1 = NSMutableAttributedString()
var part2 = NSMutableAttributedString()
var part3 = NSMutableAttributedString()
let attrRegular = [NSAttributedStringKey.font : UIFont(name: "Palatino-Roman", size: 15)]
let attrBold:Dictionary = [NSAttributedStringKey.font : UIFont(name: "Raleway-SemiBold", size: 15)]
let attrBoldWithColor: Dictionary = [NSAttributedStringKey.font : UIFont(name: "Raleway-SemiBold", size: 15),
NSAttributedStringKey.foregroundColor: UIColor.red]
if let regular = attrRegular as? [NSAttributedStringKey : NSObject]{
part1 = NSMutableAttributedString(string: "first", attributes: regular)
}
if let bold = attrRegular as? [NSAttributedStringKey : NSObject]{
part2 = NSMutableAttributedString(string: "second", attributes: bold)
}
if let boldWithColor = attrBoldWithColor as? [NSAttributedStringKey : NSObject]{
part3 = NSMutableAttributedString(string: "third", attributes: boldWithColor)
}
combination.append(part1)
combination.append(part2)
combination.append(part3)
属性列表请看这里NSAttributedStringKey on Apple Docs
超级简单的方法来做到这一点。
let text = "This is a colorful attributed string"
let attributedText =
NSMutableAttributedString.getAttributedString(fromString: text)
attributedText.apply(color: .red, subString: "This")
//Apply yellow color on range
attributedText.apply(color: .yellow, onRange: NSMakeRange(5, 4))
有关详细信息,请单击此处https://github.com/iOSTechHub/AttributedString
这个问题已经回答了......但我想展示如何添加阴影并使用NSAttributedString更改字体,这样当人们搜索这个主题时,他们就不必继续寻找。
#define FONT_SIZE 20
#define FONT_HELVETICA @"Helvetica-Light"
#define BLACK_SHADOW [UIColor colorWithRed:40.0f/255.0f green:40.0f/255.0f blue:40.0f/255.0f alpha:0.4f]
NSString*myNSString = @"This is my string.
It goes to a second line.";
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.alignment = NSTextAlignmentCenter;
paragraphStyle.lineSpacing = FONT_SIZE/2;
UIFont * labelFont = [UIFont fontWithName:FONT_HELVETICA size:FONT_SIZE];
UIColor * labelColor = [UIColor colorWithWhite:1 alpha:1];
NSShadow *shadow = [[NSShadow alloc] init];
[shadow setShadowColor : BLACK_SHADOW];
[shadow setShadowOffset : CGSizeMake (1.0, 1.0)];
[shadow setShadowBlurRadius : 1];
NSAttributedString *labelText = [[NSAttributedString alloc] initWithString : myNSString
attributes : @{
NSParagraphStyleAttributeName : paragraphStyle,
NSKernAttributeName : @2.0,
NSFontAttributeName : labelFont,
NSForegroundColorAttributeName : labelColor,
NSShadowAttributeName : shadow }];
这是一个Swift版本......
警告!这适用于4s。
对于5s,您必须将所有Float值更改为Double值(因为编译器尚未正常工作)
用
以上是关于你如何使用NSAttributedString?的主要内容,如果未能解决你的问题,请参考以下文章
你如何抚摸 NSAttributedString 的 _outside_ ?