2011-11-30 18 views
6

Ho sentito che posso visualizzare una NSAttributedString utilizzando CoreText, qualcuno può dirmi come (Il modo più semplice)?Visualizza NSAttributedString utilizzando CoreText

Per favore, non rispondere con CATextLayer o OHAttribuita.

So che ci sono un sacco di domande su questo in questo forum, ma non ho trovato la risposta

Grazie !!

+2

Se non si desidera utilizzare questi involucri, uno sguardo dentro, come funzionano. – vikingosegundo

risposta

10

Penso che il modo più semplice (utilizzando Nucleo testo) è:

// Create the CTLine with the attributed string 
CTLineRef line = CTLineCreateWithAttributedString(attrString); 

// Set text position and draw the line into the graphics context called context 
CGContextSetTextPosition(context, x, y); 
CTLineDraw(line, context); 

// Clean up 
CFRelease(line); 

utilizzando un Framesetter è più efficiente se si sta disegnando un sacco di testo, ma questo è il metodo consigliato da Apple se hai solo bisogno di visualizzare una piccola quantità di testo (come un'etichetta) e non ti richiede di creare un percorso o un fotogramma (poiché è fatto automaticamente per te da CTLineDraw).

11

Il modo più semplice? Qualcosa di simile a questo:

CGContextRef context = UIGraphicsGetCurrentContext(); 

// Flip the coordinate system 
CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
CGContextTranslateCTM(context, 0, self.bounds.size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

// Create a path to render text in 
CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddRect(path, NULL, self.bounds); 

// An attributed string containing the text to render 
NSAttributedString* attString = [[NSAttributedString alloc] 
            initWithString:...]; 

// create the framesetter and render text 
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attString); 
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, 
         CFRangeMake(0, [attString length]), path, NULL); 

CTFrameDraw(frame, context); 

// Clean up 
CFRelease(frame); 
CFRelease(path); 
CFRelease(framesetter); 
1

A partire da iOS 6 è possibile effettuare le seguenti operazioni:

NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init]; 
[paragrahStyle setLineSpacing:40]; 
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragrahStyle range:NSMakeRange(0, [labelText length])]; 

cell.label.attributedText = attributedString ;