2012-06-15 3 views
5

У меня есть CATextlayer определенного размера и NSAttributedString текст неизвестной длины.CATextlayer изменить размер FONT, чтобы он соответствовал рамке

мне нужно настроить размер шрифта, поэтому текст помещается кадр (а не наоборот :)

Любые идеи, где начать? :)

[Edit] as nall указывает, я могу определить длину строки, конечно, это какой-то текст, введенный пользователем, который мне нужно вставить в ящик фиксированного размера.

+0

Когда вы говорите, «текст неизвестной длины», вы имеете в виду не известно во время компиляции? В какой-то момент вы должны знать длину ... – nall

+0

Ха-ха - хорошо, хорошо. Это текст, который был введен пользователем в какой-то момент. Конечно, я могу получить длину строки ... :) – Swissdude

ответ

1

я в конечном итоге делает это:

textlayer является CATextlayer

theString является NSMutableAttributedString

И да, это не очень элегантный и определенно может быть улучшена;)

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

Что означает «defs»? –

0

Я считаю, что вы спрашиваете то же самое, что и this question.

Похоже, вам нужно перебирать различные размеры шрифта, чтобы определить, что будет вписываться в ваш прямоугольник.

+1

Это звучит громоздко ... – Swissdude

+0

«страница не найдена» внутри вашего ответа url –

6

Я достиг этого:

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

"MaximunWidth" в кадре CALayerWidth? –

+0

@OfirMalachi Нет, это фиксированный размер, который не может быть превышен размером текста –

-1
CATextLayer *textLayer; 

[textLayer setWrapped: TRUE]; 

Будем надеяться, будет работать

+0

Вау - это выглядит ОЧЕНЬ коротко ...;) Я попробую! Благодаря! – Swissdude