2010-09-22 13 views
9

Sto provando a capire come prendere un NSAttributedString e usarlo in Core Text sull'iPad. Ho guardato uno dei video WWDC (110), che ha scivoli (ma non il codice sorgente) e descrive come creare un NSAttributedString, poi basta metterla in un CTFramesetterRef:Posso utilizzare NSAttributedString in Core Text in iOS?

CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica-Bold"), 24.0, NULL); 

NSString* unicodeString = NSLocalizedString(@"TitleString", @"Window Title"); 
CGColorRef color = [UIColor blueColor].CGColor; NSNumber* underline = [NSNumber numberWithInt:kCTUnderlineStyleSingle|kCTUnderlinePatternDot]; 
NSDictionary* attributesDict = [NSDictionary dictionaryWithObjectsAndKeys:helveticaBold, (NSString*)kCTFontAttributeName, color, (NSString*)kCTForegroundColorAttributeName, underline, (NSString*)kCTUnderlineStyleAttributeName, nil]; 
NSAttributedString* stringToDraw = [[NSAttributedString alloc] initWithString:unicodeString attributes:attributesDict]; 

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(stringToDraw); 

CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL); 
CFRelease(framesetter); 
CTFrameDraw(frame, context); 
CFRelease(frame); 

Ma quando provo questo, genera l'errore:

Passing argument 1 of 'CTFramesetterCreateWithAttributedString' from incompatible pointer type

Sono CFAttributedString e NSAttributedString 'numero verde a ponte'? Ho letto da qualche parte che questo è vero solo su OSX, ma è così che Apple lo fa nella loro demo ...

Grazie!

: -Joe

+0

sono stati in grado di ottenere la sottolineatura tratteggiata di presentarsi? Ricevo solo la semplice sottolineatura sotto il testo. – learner2010

risposta

7

È possibile scaricare il codice sorgente WWDC10 here. Inoltre, utilizza il collegamento senza pedaggio e invia espressamente il tuo stringToDraw a CFAttributedStringRef.

+0

Grazie, ma il collegamento che hai dato continua a dire che la mia sessione è scaduta (anche quando provo ad accedere di nuovo). Ho scaricato il codice di esempio WWDC10, ma 110 non era incluso :( – jowie

+1

A parte questo, la tua soluzione ha funzionato, grazie! :-) – jowie

+1

potresti per favore pubblicare il codice finale di lavoro. – user836026

3

Sei quasi arrivato. È sufficiente trasmettere lo CTFontRef a un tipo id quando lo si aggiunge al dizionario degli attributi.

CTFontRef helveticaBold = CTFontCreateWithName(CFSTR("Helvetica-Bold"), 24.0, NULL); 

NSString* unicodeString = NSLocalizedString(@"TitleString", @"Window Title"); 

CGColorRef color = [UIColor blueColor].CGColor; 
NSNumber* underline = [NSNumber numberWithInt: 
    kCTUnderlineStyleSingle|kCTUnderlinePatternDot]; 

NSDictionary* attributesDict = [NSDictionary dictionaryWithObjectsAndKeys: 
        (id)helveticaBold, (NSString*)kCTFontAttributeName, 
        color, (NSString*)kCTForegroundColorAttributeName, 
        underline, (NSString*)kCTUnderlineStyleAttributeName, nil]; 

NSAttributedString* stringToDraw = [[NSAttributedString alloc] 
          initWithString:unicodeString 
          attributes:attributesDict];