你如何使用NSAttributedString?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你如何使用NSAttributedString?相关的知识,希望对你有一定的参考价值。

NSStringNSMutableStrings中的多种颜色是不可能的。所以我听说过一些关于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提供的所有功能,但我认为fontNamefontSize和颜色覆盖了它的大部分。期待很快更新:)

如果您需要,我可以帮助您开始使用它。也在寻找反馈,所以如果它让你的生活更轻松,我会说任务完成了。

另一答案
- (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_ ?

如何将 HTML 的 CSS 添加到 NSAttributedString?

NSAttributedString:将图像适合容器

NSAttributedString 上的可访问性(旁白)

NSAttributedString

如何在 SwiftUI 中使用 NSAttributedString 和 ScrollView?