iphone / ipad: NSAttributedString tam olarak nasıl kullanılır?


102

Evet, birçok kişi iPhone / iPad'deki Zengin Metin hakkında konuşuyor ve çoğu kişi bunu biliyor NSAttributedString.

Ama nasıl kullanılır NSAttributedString? Çok zaman aradım, bunun için hiçbir ipucu yok.

Nasıl a kurulacağını biliyorum NSAttributedString, sonra iPhone / iPad'de zengin metin içeren bir metni görüntülemek için ne yapmalıyım?

Resmi dokümanlar bunun kullanılması gerektiğini söylüyor CoreText.Framework, bu ne anlama geliyor?

Bunun gibi basit bir yolu var mı?

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

Yine de yukarıdaki cevap doğrudur. Böyle kodlayın ve CoreText çerçevesini bağlantılı çerçevelerinize eklediğinizden emin olun.
mxcl

Teşekkürler, doğru cevabı Wes'e bıraktım
Jack

Three20 ooks oldukça etkileyici bir kitaplık gibi: github.com/facebook/three20
David H

87
Three20 saçmalık.
bandejapaisa

4
Bu can sıkıcı, ama bunun daha kötü bir şey olduğunu sanmıyorum. Son 6 aydır, Three20'yi kullanan bir proje sürdürüyorum ... hafıza ile yaptıkları bazı şeyler beni şaşırtıyor. Kod, belleği geleneksel bir şekilde işlemediği için gerçekten kırılgandır. Onların sağladıkları şeyi yapmak çok daha iyidir. Sağladıkları her şeye ihtiyacınız olmayacak. Kendin yap ... daha fazlasını öğreneceksin, daha eğlenceli, muhtemelen daha iyi yapacaksın!
bandejapaisa

Yanıtlar:


79

AliSoftware's OHAttributedLabel'e bir göz atmalısınız . Bir NSAttributedString'i çizen ve ayrıca UIKit sınıflarından bir NSAttributedString'in özniteliklerini ayarlamak için kolaylık yöntemleri sağlayan bir UILabel alt sınıfıdır.

Depoda verilen örnekten:

#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.

Not: iOS 6+ sürümünde, UILabel'in attributedText özelliğini kullanarak ilişkilendirilmiş dizeleri oluşturabilirsiniz .


UIAttributedLabel diye bir şey yoktur. Sanırım bahsettiğiniz şey OHAttributedLabel.
Erik B

5
Kasım 2010'da yapılan bir işlemde OHAttributedLabel olarak yeniden adlandırıldı . Cevabımı güncelledim.
Wes

1
Teşekkürler Wes! Sen ve kodu yazan Olivier Halligon! Teşekkür ederim!
DenNukem

1
Sınıfımdan bahsettiğin için teşekkürler @Wes ve krediler için teşekkürler @DenNukem ... Bu kadar meşhur olduğunun farkında değildim;) Her neyse, orijinal gönderiden bu yana bu sınıfta pek çok güncelleme ve düzeltme yaptım, o yüzden yapma ' github deposunu çekmeyi unutmayın!
AliSoftware

Kodunuzun her satırında bir hata alıyorum.
Sağladığınız yöntemlerden hiçbirinin

155

İOS 6.0'dan başlayarak bunu şu şekilde yapabilirsiniz:

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
İOS geliştirici programının ilk kuralı, iOS geliştirme programı hakkında konuşmamaktır.
Jeremy Moyers

5
İOS geliştirici programının ikinci kuralı ... ilk kurala bakın.
futureelite7

32
Birisinin Gizlilik Sözleşmesi'ni ihlal ettiğini belirtmek, sunulan malzemenin gerçekten iOS6'da olduğunu ve bu nedenle de Gizlilik Sözleşmesi'nin bir ihlali olduğunu doğrulamaktır. "NDA'yı bozmadan [gelecek sürümde] neler olduğuna dair yorum yapmak mümkün değil" gibi bir şey yazmalısınız.
hatfinch

Ayrıca, kendinizi çok sayıda atıfta bulunulan dize yazarken bulursanız, bu gönderiye / kategoriye bakın. Oluşturmayı biraz kolaylaştırır. raizlabs.com/dev/2014/03/nsattributedstring-creation-helpers
Alex Rouse

15

Sen denemelisiniz TTTAttributedLabel . Bu, NSAttributedString ile çalışan ve UITableViewCells için yeterince yüksek performanslı olan UILabel için bir drop-in alternatifidir.


Bu sınıf, aşağıda belirtilen Three20 kütüphanesinde bulunur.
David H

10
Hayır, bu
Three20'den

6

Gibi basit yollar var mı

NSAttributedString * str;

UILabel * etiketi;

label.attributedString = str;

Neredeyse. Sadece bir CATextLayer kullanın. stringBir NSAttributedString olarak ayarlayabileceğiniz bir özelliği vardır.

DÜZENLEME (Kasım, 2012): Tabii ki tüm bunlar iOS 6'da değişti. İOS 6'da, OP'nin istediğini tam olarak yapabilirsiniz - ilişkilendirilmiş bir dizeyi doğrudan bir etikete atayın attributedText.


1
Daha spesifik olabilir misiniz, örneğin bir örnek kullanım sunabilir misiniz?
William Niu

1
Evet, buna kitabım, Programlama iOS 5 deniyor
matt

6

İOS 6'da UILabel ile ilişkilendirilmiş metin hizalaması için yanıt: NSMutableAttributedString'i kullanın ve özniteliğe NSMutableParagraphStyle ekleyin. Bunun gibi bir şey:

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

Bir NSAttributedString oluşturmak için (basitleştirilmiş) bir HTML dizesini ayrıştırmanın bir örneğini vermenin yararlı olacağını düşündüm.

Tam değil - başlangıç ​​için yalnızca <b> ve <i> etiketlerini işler ve herhangi bir hata işlemeyle uğraşmaz - ama umarım NSXMLParserDelegate ile nasıl başlayacağınıza dair yararlı bir örnektir ...


@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


Kullanmak için şuna benzer bir şey yapın:


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


5

İOS 6.0'dan başlayarak bunu şu şekilde yapabilirsiniz: başka bir örnek kod.

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

For Swift bunu kullanın,

Başlık metinlerini kalın yapacak ,

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

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

    label.attributedText = title

2

Biliyorum biraz geç, ama başkaları için faydalı olacak

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

[self.label setAttributedText:newString];

Sözlüğe istenen özniteliği ekleyin ve öznitelik parametresi olarak iletin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.