iPhone / iPad:究竟如何使用NSAttributedString?


102

是的,很多人都在谈论iPhone / iPad中的RTF,并且很多人都知道NSAttributedString

但是如何使用NSAttributedString?我搜索了很多时间,没有任何线索。

我知道如何设置NSAttributedString,然后如何在iPhone / iPad上显示带有富文本格式的文本?

官方文档说应该与一起使用CoreText.Framework,这是什么意思?

有没有像这样的简单方法?

NSAttributedString *str;
.....
UILabel *label;
label.attributedString = str;

上面的答案是正确的。这样的代码,并确保将CoreText框架添加到链接的框架中。
mxcl 2010年

谢谢,我给韦斯留下了正确答案
杰克2010年

Three20 ooks就像一个令人印象深刻的库:github.com/facebook/three20
David H

87
Three20是胡扯。
bandejapaisa 2012年

4
那很烦人,但我认为那不是最糟糕的事情。在过去的6个月中,我一直在维护一个使用Three20的项目……他们在记忆方面所做的某些事情使我感到困惑。该代码非常脆弱,因为它无法以正统的方式处理内存。做他们自己提供的东西要好得多。您不太可能需要它们提供的所有内容。自己动手...您会学到更多,它会更有趣,您可能会做得更好!
bandejapaisa 2012年

Answers:


79

您应该看一下AliSoftware的OHAttributedLabel。它是UILabel的子类,它绘制NSAttributedString并提供方便的方法来从UIKit类设置NSAttributedString的属性。

从仓库中提供的样本中:

#import "NSAttributedString+Attributes.h"
#import "OHAttributedLabel.h"

/**(1)** Build the NSAttributedString *******/
NSMutableAttributedString* attrStr = [NSMutableAttributedString attributedStringWithString:@"Hello World!"];
// for those calls we don't specify a range so it affects the whole string
[attrStr setFont:[UIFont systemFontOfSize:12]];
[attrStr setTextColor:[UIColor grayColor]];
// now we only change the color of "Hello"
[attrStr setTextColor:[UIColor redColor] range:NSMakeRange(0,5)];


/**(2)** Affect the NSAttributedString to the OHAttributedLabel *******/
myAttributedLabel.attributedText = attrStr;
// Use the "Justified" alignment
myAttributedLabel.textAlignment = UITextAlignmentJustify;
// "Hello World!" will be displayed in the label, justified, "Hello" in red and " World!" in gray.

注意:在iOS 6+中,您可以使用UILabel 的attributedText属性呈现属性字符串。


没有UIAttributedLabel这样的东西。我认为您指的是OHAttributedLabel。
Erik B 2010年

5
在2010年11月的一次提交中,它被重命名为OHAttributedLabel 。我已经更新了答案。
Wes

1
谢谢韦斯!您和编写代码的Olivier Halligon!谢谢!
DenNukem'2

1
感谢@Wes提及我的课程,并感谢@DenNukem的功课...我不知道它是如此出名;)无论如何,自从最初的帖子以来,我对该类做了很多更新和修复,所以不要别忘了拉github回购!
AliSoftware 2011年

我在您的代码的每一行上都遇到错误。根据你实际提供的类存在的方法的文档不,我很困惑:developer.apple.com/library/mac/#documentation/Cocoa/Reference/...
aryaxt

155

从iOS 6.0开始,您可以这样做:

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"Hello. That is a test attributed string."];
[str addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:NSMakeRange(3,5)];
[str addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(10,7)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:20.0] range:NSMakeRange(20, 10)];
label.attributedText = str;

60
iOS开发程序的第一条规则是不谈论iOS开发程序。
杰里米·莫耶斯

5
iOS开发程序的第二条规则是...请参阅第一条规则。
futureelite7'9

32
声明某人违反了NDA就是要确认提供的资料确实在iOS6中,因此本身就是对NDA的违反。您应该编写类似“在不破坏NDA的情况下,无法对[即将发布的版本]中的内容发表评论”之类的内容。
hatfinch 2012年

另外,如果您发现自己编写了很多属性字符串,请查看此帖子/类别。使创建更加容易。raizlabs.com/dev/2014/03/nsattributedstring-creation-helpers
Alex Rouse

15

您应该尝试TTTAttributedLabel。它是UILabel的直接替代品,可与NSAttributedString一起使用,并且对UITableViewCells足够有效。


此类在下面提到的Three20库中找到。
David H

10
不,这不是来自three20(请注意3个T)
vikingosegundo

6

有没有简单的方法,例如

NSAttributedString * str;

UILabel *标签;

label.attributedString = str;

几乎。只需使用CATextLayer。它具有string可以设置为NSAttributedString的属性。

编辑(2012年11月):当然,这在iOS 6中已经发生了变化。在iOS 6中,您可以完全执行OP要求的操作-将属性字符串直接分配给标签的attributedText


1
您能否更具体一点,例如提供示例用法?

1
是的,这就是我的书《 iOS 5编程》。这是书中的代码示例:github.com/mattneub/Programming-iOS-Book-Examples/blob/master/…–
matt

6

在iOS 6上针对UILabel属性文本对齐的答案:使用NSMutableAttributedString并将NSMutableParagraphStyle添加到属性。像这样:

NSString *str = @"Hello World!";
NSRange strRange = NSMakeRange(0, str.length);
NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:str];

NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];
[paragrahStyle setAlignment:NSTextAlignmentCenter];
[attributedStr addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:strRange];

myUILabel.attributedText = attributedStr;

6

我认为举一个解析(简化的)HTML字符串来创建NSAttributedString的示例很有用。

它并不完整-对于初学者来说,它仅处理<b>和<i>标签,并且不打扰任何错误处理-但希望它也是如何入门NSXMLParserDelegate的有用示例...


@interface ExampleHTMLStringToAttributedString : NSObject<NSXMLParserDelegate>

+(NSAttributedString*) getAttributedStringForHTMLText:(NSString*)htmlText WithFontSize:(CGFloat)fontSize;

@end

@interface ExampleHTMLStringToAttributedString()
@property NSString *mpString;
@property NSMutableAttributedString *mpAttributedString;

@property CGFloat mfFontSize;
@property NSMutableString *appendThisString;
@property BOOL mbIsBold;
@property BOOL mbIsItalic;
@end

@implementation ExampleHTMLStringToAttributedString
@synthesize mpString;
@synthesize mfFontSize;
@synthesize mpAttributedString;
@synthesize appendThisString;
@synthesize mbIsBold;
@synthesize mbIsItalic;

+(NSAttributedString*) getAttributedStringForHTMLText:(NSString*)htmlText WithFontSize:(CGFloat)fontSize {

    ExampleHTMLStringToAttributedString *me = [[ExampleHTMLStringToAttributedString alloc] initWithString:htmlText];
    return [me getAttributedStringWithFontSize:fontSize];
}

- (id)initWithString:(NSString*)inString {
    self = [super init];
    if (self) {
        if ([inString hasPrefix:@""]) {
          mpString = inString;
        } else {
            mpString = [NSString stringWithFormat:@"%@", inString];
        }
        mpAttributedString = [NSMutableAttributedString new];
    }
    return self;
}

-(NSAttributedString*) getAttributedStringWithFontSize:(CGFloat)fontSize {

    mfFontSize = fontSize;

    // Parse the XML
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:[mpString dataUsingEncoding:NSUTF8StringEncoding]];
    parser.delegate = self;
    if (![parser parse]) {
        return nil;
    }

    return mpAttributedString;
}

-(void) appendTheAccumulatedText {
    UIFont *theFont = nil;

    if (mbIsBold && mbIsItalic) {
        // http://stackoverflow.com/questions/1384181/italic-bold-and-underlined-font-on-iphone
        theFont = [UIFont fontWithName:@"Helvetica-BoldOblique" size:mfFontSize];
    } else if (mbIsBold) {
       theFont = [UIFont boldSystemFontOfSize:mfFontSize];
    } else if (mbIsItalic) {
        theFont = [UIFont italicSystemFontOfSize:mfFontSize];
    } else {
        theFont = [UIFont systemFontOfSize:mfFontSize];
    }

    NSAttributedString *appendThisAttributedString =
    [[NSAttributedString alloc]
     initWithString:appendThisString
     attributes:@{NSFontAttributeName : theFont}];

    [mpAttributedString appendAttributedString:appendThisAttributedString];

    [appendThisString setString:@""];
}

#pragma NSXMLParserDelegate delegate

-(void)parserDidStartDocument:(NSXMLParser *)parser{
    appendThisString = [NSMutableString new];
    mbIsBold = NO;
    mbIsItalic = NO;
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    if ([elementName isEqualToString:@"body"]){
    } else if ([elementName isEqualToString:@"i"]) {
      [self appendTheAccumulatedText];
        mbIsItalic = YES;
    } else if ([elementName isEqualToString:@"b"]) {
      [self appendTheAccumulatedText];
        mbIsBold = YES;
    }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if ([elementName isEqualToString:@"body"]){
      [self appendTheAccumulatedText];
    } else if ([elementName isEqualToString:@"i"]) {
      [self appendTheAccumulatedText];
      mbIsItalic = NO;
    } else if ([elementName isEqualToString:@"b"]) {
        [self appendTheAccumulatedText];
        mbIsBold = NO;
    }
}

-(void)parserDidEndDocument:(NSXMLParser *)parser{
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    [appendThisString appendString:string];
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
}

@end


要使用,请执行以下操作:


  self.myTextView.attributedText = [ExampleHTMLStringToAttributedString getAttributedStringForHTMLText:@"this is <b>bold</b> text" WithFontSize:self.myTextView.pointSize];


5

从iOS 6.0开始,您可以这样做:另一个示例代码。

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"This is my test code to test this label style is working or not on the text to show other user"];

[str addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(0,31)];
[str addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:NSMakeRange(61,10)];

[str addAttribute:NSFontAttributeName value: [UIFont fontWithName:@"Helvetica-Bold" size:13.0] range:NSMakeRange(32, 28)];
[str addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Helvetica-Bold" size:13.0] range:NSMakeRange(65, 20)];

_textLabel.attributedText = str;

2

对于Swift来说,

这样会使Titl文本加粗,

var title = NSMutableAttributedString(string: "Title Text")

    title.addAttributes([NSFontAttributeName: UIFont(name: "AvenirNext-Bold", size: iCurrentFontSize)!], range: NSMakeRange(0, 4))

    label.attributedText = title

2

我知道这有点晚了,但是它将对其他人有用,

NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithString:@"string" attributes:@{NSForegroundColorAttributeName:[UIColor blackColor]}];

[self.label setAttributedText:newString];

将所需的属性添加到字典,并将其作为属性参数传递

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.