iphone / ipad:NSAttributedStringをどのように正確に使用しますか?


102

はい、多くの人々がiPhone / iPadのリッチテキストについて言っており、多くは知っていNSAttributedStringます。

しかし、どのように使用しNSAttributedStringますか?私は多くの時間を検索しましたが、このための手がかりはありません。

を設定する方法を知っNSAttributedStringていますが、iPhone / iPadでリッチテキスト付きのテキストを表示するにはどうすればよいですか?

公式ドキュメントは、それをで使用する必要があると言っていますがCoreText.Framework、それはどういう意味ですか?

このような簡単な方法はありますか?

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

上記の答えは正しいです。そのようなコードを作成し、CoreTextフレームワークをリンクされたフレームワークに追加してください。
mxcl

おかげで、私はウェスに正しい答えを残しました
ジャック

Three20はかなり印象的なライブラリのように見えます:github.com/facebook/three20
David H

87
Three20はがらくたです。
bandejapaisa

4
それは厄介ですが、それが悪いことだとは思いません。過去6か月間、Three20を使用するプロジェクトを維持してきました。メモリでの処理の一部は私を困惑させます。コードはメモリを通常の方法で処理しないため、非常に脆弱です。彼らが自分で提供することをする方がはるかに良いです。彼らが提供するすべてが必要になることはほとんどありません。自分でやって...もっと学び、もっと楽しく、たぶんもっと上手になります!
bandejapaisa

回答:


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のattributedTextプロパティを使用して属性付き文字列をレンダリングできます。


UIAttributedLabelのようなものはありません。あなたが言及しているのはOHAttributedLabelだと思います。
エリックB

5
2010年11月のコミットで OHAttributedLabelに名前が変更されました。回答を更新しました。
ウェス

1
ウェスありがとう!あなたとコードを書いたオリビエ・ハリゴン!ありがとうございました!
DenNukem、2011

1
私のクラスに言及してくれて@Wesに感謝し、クレジットに@DenNukemに感謝します...それがそれほど有名であることに気づいていませんでした;)とにかく、元の投稿以来、このクラスで多くの更新と修正を行ったので、しないでくださいGitHubリポジトリをプルすることを忘れないでください!
AliSoftware

コードの1行ごとにエラーが発生します。あなたは、実際のクラスに存在を提供する方法のドキュメントの非によると、私は混乱しています: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開発プログラムの2番目のルールは...最初のルールを参照してください。
futureelite7 '10 / 09/12

32
誰かがNDAに違反していると述べることは、提示された資料が確かにiOS6にあることを確認することであり、それ自体がNDAの違反です。「NDAを破らずに[次のバージョン]の内容にコメントすることはできません」のようなものを書く必要があります。
ハトフィンチ2012年

また、多くの属性付き文字列を作成している場合は、この投稿/カテゴリを確認してください。作成が少し簡単になります。raizlabs.com/dev/2014/03/nsattributedstring-creation-helpers
Alex Rouse


6

のような簡単な方法はありますか

NSAttributedString * str;

UILabel * label;

label.attributedString = str;

ほとんど。CATextLayerを使用するだけです。それは持っているstringあなたがNSAttributedStringに設定することができますプロパティを。

編集(2012年11月):もちろん、これはすべてiOS 6で変更されました。iOS6では、OPが要求したとおりに、属性付きの文字列をラベルのに直接割り当てることができますattributedText


1
もっと具体的に教えていただけますか、使用例を提供してください。
William Niu

1
はい、それはiOSの5のプログラミング、私の本と呼ばれています。ここブックからのコード例を示します。github.com/mattneub/Programming-iOS-Book-Examples/blob/master/...
マット

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.