2012-06-15 13 views
5

Mam CATextlayer o określonym rozmiarze i NSAttributedString tekst o nieznanej długości.Rozmiar zmiany rozmiaru ramki FONT w celu dopasowania do ramki

muszę dostosować rozmiar czcionki tak tekst pasuje do ramki (nie odwrotnie :)

pomysłów od czego zacząć? :)

[Edytuj], jak ogólnie zaznaczam, mogę określić długość łańcucha, oczywiście, to jakiś tekst wpisany przez użytkownika, który muszę dopasować do pudełka o stałym rozmiarze.

+0

Kiedy mówisz „tekst nieznanej długości” Nie masz na myśli znany w czasie kompilacji? W pewnym momencie * musisz * znać długość ... – nall

+0

Haha - ok, dobry punkt. Jest to tekst, który został wprowadzony przez użytkownika w pewnym momencie. Oczywiście, mogę uzyskać długość łańcucha ... :) – Swissdude

Odpowiedz

1

skończyło się w ten sposób:

textlayer jest CATextlayer

theString jest NSMutableAttributedString

I tak, to nie jest bardzo elegancki i na pewno można poprawić;)

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

Co to jest "defs"? –

0

Wierzę, że pytasz o to samo, co this question.

Wygląda na to, że musisz powtórzyć różne rozmiary czcionek, aby określić, które elementy zmieszczą się wewnątrz prostokąta.

+1

To brzmi nieporęcznie ... – Swissdude

+0

"Nie znaleziono strony" wewnątrz adresu URL odpowiedzi –

6

Osiągnąłem to, wykonując to:

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

to "MaximunWidth" ramka CALayerWidth? –

+0

@OfirMalachi Nie, jest to stały rozmiar, którego nie może przekroczyć rozmiar tekstu –

-1
CATextLayer *textLayer; 

[textLayer setWrapped: TRUE]; 

Miejmy nadzieję, że będzie działać

+0

Wow - wygląda BARDZO krótko ...;) Spróbuję! Dzięki! – Swissdude

Powiązane problemy