2012-06-15 16 views
5

फिट करने के लिए FAT का CATextlayer परिवर्तन आकार मेरे पास एक निश्चित आकार के CATextlayer और NSAttributedString अज्ञात लंबाई का टेक्स्ट है।फ्रेम

मैं इतना पाठ फ्रेम (इसके विपरीत नहीं :)

कोई भी विचार जहां शुरू करने के लिए फिट बैठता है font-size समायोजित करने की आवश्यकता? :)

[संपादित करें] नल बिंदुओं के रूप में, मैं स्ट्रिंग लम्बाई निर्धारित कर सकता हूं, निश्चित रूप से, यह उपयोगकर्ता द्वारा दर्ज किया गया कुछ पाठ है जिसे मुझे निश्चित आकार के बॉक्स में फिट करने की आवश्यकता है।

+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

आपके उत्तर यूआरएल –

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

कैलेयरविड्थ फ्रेम "मैक्सिमुनविड्थ" है? –

+0

@OfirMalachi नहीं, यह निश्चित आकार है जिसे टेक्स्ट आकार –

-1
CATextLayer *textLayer; 

[textLayer setWrapped: TRUE]; 

यह उम्मीद है कि

+0

वाह से पार नहीं किया जा सकता है - यह बहुत छोटा लगता है ...;) मैं इसे आज़मा दूंगा! धन्यवाद! – Swissdude

संबंधित मुद्दे