2012-06-15 4 views
5

Ich habe eine CATextlayer einer bestimmten Größe und NSAttributedString Text unbekannter Länge.CATextlayer Größe von FONT ändern, um den Rahmen zu passen

Ich brauche die font-size einzustellen, so der Text den Rahmen (nicht umgekehrt passt :)

Irgendwelche Ideen, wo anfangen? :)

[Edit] wie nall zeigt, kann ich die String-Länge bestimmen, natürlich ist es ein Text vom Benutzer eingegeben, dass ich in eine Box mit fester Größe passen muss.

+0

arbeiten, wenn Sie ‚Text eines unbekannten Länge‘ sagen, meinen Sie bei der Kompilierung nicht bekannt? Irgendwann musst du * die Länge kennen ... – nall

+0

Haha - ok, guter Punkt. Es ist Text, der vom Benutzer irgendwann eingegeben wurde. Natürlich kann ich die String-Länge bekommen ... :) – Swissdude

Antwort

1

landete ich tun dies:

textlayer ist ein CATextlayer

theString ein NSMutableAttributedString

ist Und ja, es ist nicht sehr elegant und auf jeden Fall verbessert werden könnte;)

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)theString); 

    CGRect columnRect = CGRectMake(0, 0 , 320, 150); 

    CGMutablePathRef path = CGPathCreateMutable(); 
    CGPathAddRect(path, NULL, columnRect); 

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

    CFRange frameRange = CTFrameGetVisibleStringRange(frame); 

    int fontSize = 18; 

    while(theString.string.length > frameRange.length){ 

     fontSize--; 

     CFStringRef fontName = (__bridge CFStringRef)[defs objectForKey:@"font"]; 

     CTFontRef font = CTFontCreateWithName(fontName, fontSize, NULL); 

     [theString addAttribute:(NSString *)kCTFontAttributeName 
          value:(__bridge id)font 
          range:NSMakeRange(0, theString.string.length)]; 

     CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)theString); 

     CGRect columnRect = CGRectMake(0, 0 , 320, 150); 

     CGMutablePathRef path = CGPathCreateMutable(); 
     CGPathAddRect(path, NULL, columnRect); 

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

     frameRange = CTFrameGetVisibleStringRange(frame); 

     textLayer.string = theString; 
    } 
+0

Was ist "Defs" bedeuten? –

0

Ich glaube, Sie fragen das Gleiche wie this question.

Es sieht so aus, als ob Sie über eine Vielzahl von Schriftgrößen iterieren müssen, um zu bestimmen, welche in Ihr Rect passen.

+1

Das klingt umständlich ... – Swissdude

+0

"Seite nicht gefunden" in Ihrer Antwort URL –

6

Ich erreichte es dadurch:

float fontSize = InitialFontSize; 
    UIFont *myFont = [UIFont boldSystemFontOfSize:fontSize]; 
    CGSize myFontSize = [YourTextHere sizeWithFont:myFont]; 
    while (myFontSize.width >= MaximunWidth) { 
     fontSize -= 0.1f; 
     myFont = [UIFont boldSystemFontOfSize:fontSize]; 
     myFontSize = [YourTextHere sizeWithFont:myFont]; 
    } 
    CATextLayer *textLayer = [CATextLayer layer]; 
    [textLayer setFrame:CGRectMake(MaximunWidth - myFontSize.width/2, MaximunHeight - myFontSize.height/2, myFontSize.width, myFontSize.height)]; 
    [textLayer setFontSize:fontSize]; 
    [textLayer setString:YourTextHere]; 

    [textLayer setAlignmentMode:kCAAlignmentCenter]; 
+0

ist "MaximunWidth" der CALayerWidth Rahmen? –

+0

@OfirMalachi Nein, es ist die feste Größe, die nicht von der Textgröße überschritten werden kann –

-1
CATextLayer *textLayer; 

[textLayer setWrapped: TRUE]; 

Dies wird hoffentlich wird

+0

Wow - das sieht sehr kurz aus ...;) Ich werde es versuchen! Vielen Dank! – Swissdude