iphone / ipad : NSAttributedString을 정확히 어떻게 사용합니까?


102

예, 많은 사람들이 iPhone / iPad의 리치 텍스트에 대해 이야기하고 있으며 많은 사람들이 NSAttributedString.

그러나 사용하는 방법 NSAttributedString? 나는 많은 시간을 검색했지만 이것에 대한 단서를 추출하지 못했습니다.

를 설정하는 방법을 알고 있는데 NSAttributedStringiPhone / iPad에 서식있는 텍스트로 텍스트를 표시하려면 어떻게해야합니까?

공식 문서에서는와 함께 사용해야한다고 말합니다. 그게 CoreText.Framework무슨 뜻인가요?

이와 같은 간단한 방법이 있습니까?

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

위의 대답은 정확합니다. 이와 같은 코드를 작성하고 CoreText 프레임 워크를 링크 된 프레임 워크에 추가했는지 확인하십시오.
mxcl

감사합니다. 저는 Wes에 정답을 남겼습니다
Jack

꽤 인상적인 라이브러리와 같은 Three20 ooks : github.com/facebook/three20
데이비드 H

87
Three20은 쓰레기입니다.
bandejapaisa

4
성가신 일이지만 그게 더 나쁘다고 생각하지 않습니다. 지난 6 개월 동안 저는 Three20을 사용하는 프로젝트를 유지해 왔습니다. 그들이 메모리로하는 일 중 일부는 저를 당혹스럽게 만듭니다. 이 코드는 정통 방식으로 메모리를 처리하지 않기 때문에 매우 취약합니다. 그들이 제공하는 것을하는 것이 훨씬 낫습니다. 그들이 제공하는 모든 것이 필요하지 않을 것입니다. 직접 해보세요 ... 더 많이 배우고, 더 재미 있고, 아마 더 잘할 것입니다!
bandejapaisa 2012

답변:


79

AliSoftware의 OHAttributedLabel을 살펴 보아야 합니다. NSAttributedString을 그리는 UILabel의 서브 클래스이며 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 의 속성 텍스트 속성을 사용하여 속성 문자열을 렌더링 할 수 있습니다 .


UIAttributedLabel과 같은 것은 없습니다. 나는 당신이 말하는 것이 OHAttributedLabel이라고 생각합니다.
Erik B

5
2010 년 11 월 커밋에서 OHAttributedLabel로 이름이 변경되었습니다 . 내 답변을 업데이트했습니다.
Wes 2011 년

1
Wes 감사합니다! 코드를 작성한 당신과 Olivier Halligon! 감사합니다!
DenNukem

1
제 수업을 언급 해주셔서 @Wes에게 감사하고 크레딧에 대해 @DenNukem에게 감사드립니다 ... 나는 그것이 그렇게 유명하다는 것을 몰랐습니다;) 어쨌든, 나는 원래 포스트 이후이 수업에서 많은 업데이트와 수정을 했으므로, 그러지 마세요. t github repo를 당기는 것을 잊지 마십시오!
AliSoftware

코드의 한 줄마다 오류가 발생합니다. 제공 한 메서드가 아닌 설명서에 따르면 실제 클래스에 존재합니다. 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 개발 프로그램에 대해 이야기하지 않는 것입니다.
Jeremy Moyers

5
iOS 개발 프로그램의 두 번째 규칙은 ... 첫 번째 규칙을 참조하십시오.
futureelite7

32
누군가가 NDA를 위반했음을 알리는 것은 제시된 자료가 실제로 iOS6에 있음을 확인하는 것이므로 그 자체로 NDA를 위반 한 것입니다. "NDA를 위반하지 않고는 [다음 버전]에있는 내용에 대해 의견을 제시 할 수 없습니다."와 같이 작성해야합니다.
hatfinch

또한 많은 속성 문자열을 작성하는 경우이 게시물 / 카테고리를 확인하십시오. 창조를 조금 더 쉽게 만듭니다. raizlabs.com/dev/2014/03/nsattributedstring-creation-helpers
알렉스 기상

15

TTTAttributedLabel 을 시도해야합니다 . NSAttributedString과 함께 작동하고 UITableViewCells에 충분한 성능을 발휘하는 UILabel의 드롭 인 대체품입니다.


이 클래스는 아래에 언급 된 Three20 라이브러리에 있습니다.
데이비드 H

10
아니요, 이건 three20이 아닙니다. (3 Ts 참고)
vikingosegundo 2011

6

다음과 같은 간단한 방법이 있습니까?

NSAttributedString * str;

UILabel * label;

label.attributedString = str;

거의. CATextLayer를 사용하십시오. stringNSAttributedString으로 설정할 수 있는 속성이 있습니다.

편집 (2012 년 11 월) : 물론이 모든 것이 iOS 6에서 변경되었습니다. iOS 6에서는 OP가 요청한대로 정확하게 수행 할 수 있습니다. 속성 문자열을 레이블의 attributedText.


1
예를 들어 사용 예제를 제공하는 등 좀 더 구체적으로 말씀해 주시겠습니까?
William Niu 2012

1
예, 내 책, Programming 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

NSAttributedString을 생성하기 위해 (간단한) HTML 문자열을 구문 분석하는 예제를 제공하는 것이 유용 할 것이라고 생각했습니다.

완전하지 않습니다. 시작을 위해 <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

들어 스위프트는 이를 사용,

그것은 것 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];

원하는 속성을 사전에 추가하고 속성 매개 변수로 전달하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.