2013-09-23 8 views
5

जटिल पीडीएफ दस्तावेजों के निर्माण के लिए मुद्रित तारों के लेआउट को निर्धारित करने के लिए मैं कई तरीकों का उपयोग कर रहा हूं IOS7 में बहिष्कृत किया गया है।आकार के लिए प्रतिस्थापन WithFont: ForWidth: lineBreakMode:

boundingRectWithSize:options:attributes: 

कि sizeWithFont:ConstrainedTosize:lineBreakMode के लिए ठीक है, लेकिन क्या हुआ अगर मैं केवल एक लाइन पर मेरी स्ट्रिंग हैं: प्रलेखन कि अनुचित हैं सब sizeWithFont तरीकों के लिए स्थानापन्न के रूप में उपयोग करने के लिए एक ही विधि से जुड़ी जानकारी? मुझे नहीं पता कि अधिकतम ऊंचाई के लिए क्या उपयोग करना है, इसलिए मेरे पास पहले पैरामीटर के लिए मान के रूप में हाथ नहीं है।

यहां दिए गए आकार में सीमित होने पर मेरे पास यह है।

CGFloat maxHeightAllowable = _maxHeight; 
CGSize issueTitleMaxSize = CGSizeMake(_issueListTitleColWidth - (kColumnMargin *2), maxHeightAllowable); 
NSDictionary *issueTitleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:_bodyFont, NSFontAttributeName, nil]; 
CGRect issueTitleRect = CGRectIntegral([issueTitleText boundingRectWithSize:issueTitleMaxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:issueTitleAttributes context:nil]); 
CGSize issueTitleSize = issueTitleRect.size; 

मैं इस एक ही विधि का उपयोग कैसे होता अगर मैं maxHeight पता नहीं है, या वास्तव में, एक पंक्ति के लिए ऊंचाई ठीक है कि मैं क्या पता लगाने के लिए कोशिश कर रहा हूँ?

मुझे लगता है कि वे एनएसएट्रिब्रिटेड तारों और ऑटो लेआउट के लिए संगतता की ओर क्यों दबाव डाल रहे हैं लेकिन इन्हें क्यों हटा दें? प्रतिस्थापन, मेरे मामले में, अब 4 या 5 कदम उठाता है जहां यह 1 या 2 होता है।

लाइन टी का उपयोग करके, टी टी द्वारा सुझाए गए फ़ॉन्ट की संपत्ति, मैंने इन विधियों को एक श्रेणी में बनाया जो मेरे लिए बहुत सरल बनाता है प्रतिस्थापन।

#import "NSString+SizingForPDF.h" 

@implementation NSString (SizingForPDF) 

-(CGSize)integralSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)maxSize 
{ 
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil]; 
    CGRect rect = CGRectIntegral([self boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil]); 
    return rect.size; 
} 

-(CGSize)integralSizeWithFont:(UIFont *)font maxWidth:(CGFloat)maxWidth numberOfLines:(NSInteger)lines 
{ 
    if (lines == 0) { 
     lines = 1; 
    } 
    NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; 
    CGFloat height = font.lineHeight * lines; 
    CGSize maxsize = CGSizeMake(maxWidth, height); 
    CGRect rect = CGRectIntegral([self boundingRectWithSize:maxsize options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesFontLeading attributes:attributes context:nil]); 
    return rect.size; 
} 

@end 

उत्तर

15

आप सिर्फ एक लाइन की ऊंचाई देख रहे थे, तो आप सिर्फ अपने फ़ॉन्ट के lineHeight संपत्ति का उपयोग नहीं कर सकता है? मैं इसका उपयोग अपने लेबल की ऊंचाई निर्धारित करने के लिए करता हूं या बिना किसी समस्या के तत्वों की ऊंचाई का अनुमान लगाता हूं। मुझे यकीन नहीं है कि इस संबंध में पीडीएफ दस्तावेज अलग हैं।

इसके अतिरिक्त, मेरा मानना ​​है कि उन कार्यों को बहिष्कृत कर दिया गया था क्योंकि एनएसएसटींग + UIKit फ़ंक्शंस (sizeWithFont:..., आदि) की श्रृंखला UIStringDrawing लाइब्रेरी पर आधारित थी, जो थ्रेड सुरक्षित नहीं था। यदि आपने उन्हें मुख्य थ्रेड (किसी अन्य UIKit कार्यक्षमता की तरह) पर चलाने की कोशिश की है, तो आपको अप्रत्याशित व्यवहार मिलेंगे। विशेष रूप से, यदि आप एक साथ कई धागे पर फ़ंक्शन चलाते हैं, तो यह शायद आपके ऐप को क्रैश कर देगा। यही कारण है कि आईओएस 6 में, उन्होंने NSAttributedStrings के लिए boundingRectWithSize:... विधि पेश की। यह NSStringDrawing पुस्तकालयों के शीर्ष पर बनाया गया था और धागा सुरक्षित है।

उस नोट पर, यदि आप केवल आईओएस 6 और आईओएस 7 का समर्थन कर रहे थे, तो मैं निश्चित रूप से आपके सभी एनएसएसटींगिंग sizeWithFont:... को एनएसएट्रिब्यूटस्ट्रिंग के boundingRectWithSize में बदल दूंगा। यदि आपके पास अजीब बहु-थ्रेडिंग कोने का मामला है तो यह आपको बहुत सी सिरदर्द बचाएगा! यहाँ कैसे मैं परिवर्तित है NSString के sizeWithFont:constrainedToSize::

क्या हुआ करता था:

NSString *text = ...; 
CGFloat width = ...; 
UIFont *font = ...; 
CGSize size = [text sizeWithFont:font 
       constrainedToSize:(CGSize){width, CGFLOAT_MAX}]; 

आसानी के साथ प्रतिस्थापित किया जा सकता है:

NSString *text = ...; 
CGFloat width = ...; 
UIFont *font = ...; 
NSAttributedString *attributedText = 
    [[NSAttributedString alloc] 
     initWithString:text 
     attributes:@ 
     { 
      NSFontAttributeName: font 
     }]; 
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} 
              options:NSStringDrawingUsesLineFragmentOrigin 
              context:nil]; 
CGSize size = rect.size; 

कृपया प्रलेखन ध्यान दें का उल्लेख है:

आईओएस में 7 और बाद में, यह विधि आंशिक आकार लौटाती है (आकार वापसी के घटक में एड सीजीआरईटी); लौटा आकार का आकार विचारों का उपयोग करने के लिए, आपको छत समारोह का उपयोग करके निकटतम उच्च पूर्णांक पर अपना मान बढ़ाने का उपयोग करना होगा।

तो गणना ऊंचाई या चौड़ाई विचारों को आकार देने के लिए इस्तेमाल किया जाएगा बाहर निकलने के लिए, मैं का प्रयोग करेंगे:

CGFloat height = ceilf(size.height); 
CGFloat width = ceilf(size.width); 
+0

आपका विधि काफी मेरा रूप में ही है, केवल मैं CGRectIntegral मैक्रो का उपयोग करने के लिए क्लैंप पूर्णांक के मान। मैंने लाइन ऊंचाई के लिए फ़ॉन्ट को कभी नहीं सोचा था। वह मेरे लिए जवाब था। मैंने इसे एक ऐसी श्रेणी में कुछ नए तरीके बनाने के लिए उपयोग किया जो मेरे पूर्व कोड को आसानी से बदल देता है। –

+1

LineBreakMode को एक NSParagraphStyle विशेषता द्वारा प्रतिस्थापित किया गया है जिसे विशेषता शब्दकोश में जोड़ा जा सकता है। इसे कैसे करें इसके विस्तृत उदाहरण के लिए http://stackoverflow.com/a/26894770/338468 देखें। –

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