2012-06-15 52 views
5

Tôi có một kích thước CATextlayer có kích thước nhất định và văn bản NSAttributedString có độ dài không xác định.Kích thước thay đổi CATextlayer của FONT cho vừa với khung

tôi cần phải điều chỉnh font-size nên các văn bản phù hợp với khung (không phải ngược lại :)

Bất kỳ ý tưởng bắt đầu từ đâu? :)

[Chỉnh sửa] như đã chỉ ra, tôi có thể xác định độ dài chuỗi, tất nhiên, đó là một số văn bản được người dùng nhập mà tôi cần để vừa với một hộp có kích thước cố định.

+0

Khi bạn nói 'text của một chiều dài chưa biết', bạn có nghĩa là không biết đến tại thời gian biên dịch? Tại một số thời điểm, bạn * phải * biết chiều dài ... – nall

+0

Haha - ok, điểm tốt. Đó là văn bản được người dùng nhập vào tại một thời điểm nào đó. Tất nhiên, tôi có thể nhận được chuỗi dài ... :) – Swissdude

Trả lời

1

tôi đã kết thúc làm điều này:

textlayer là một CATextlayer

theString là một NSMutableAttributedString

Và vâng, nó không phải rất thanh lịch và chắc chắn có thể được cải thiện;)

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" nghĩa là gì? –

0

Tôi tin rằng bạn đang yêu cầu cùng một điều như this question.

Dường như bạn phải lặp qua nhiều kích thước phông chữ khác nhau để xác định kích thước nào phù hợp với nội dung của bạn.

+1

Điều đó nghe có vẻ cồng kềnh ... – Swissdude

+0

"trang không tìm thấy" bên trong url trả lời của bạn –

6

Tôi đã đạt được điều này bằng cách thực hiện điều này:

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

là "MaximunWidth" khung CALayerWidth? –

+0

@OfirMalachi Không, Đây là kích thước cố định không thể vượt quá kích thước văn bản –

-1
CATextLayer *textLayer; 

[textLayer setWrapped: TRUE]; 

này sẽ hy vọng sẽ làm việc

+0

Chà - điều này có vẻ rất ngắn ...;) Tôi sẽ thử! Cảm ơn! – Swissdude

Các vấn đề liên quan