2013-09-16 8 views
6

में बहिष्कृत मैं अपना ऐप आईओएस 7 में अपडेट कर रहा हूं और आखिरकार इसे मिला, लेकिन एक चीज है जिसके लिए मुझे कोई समाधान नहीं मिल रहा है।आकार WithFont: बाधित करने के लिए: लाइनब्रैक मोड: आईओएस 7

Xcode 4 में मैं निम्नलिखित विधि का इस्तेमाल किया:

#define FONT_SIZE 14.0f 
#define CELL_CONTENT_WIDTH 280.0f 
#define CELL_CONTENT_MARGIN 10.0f 


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { 
    NSString *text = [textA objectAtIndex:[indexPath row]]; 

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; 

    CGFloat height = MAX(size.height, 28.0f); 

    return height + (CELL_CONTENT_MARGIN * 2); 
} 

लेकिन जब यह आईओएस 7 में उपयोग करते हुए मैं एक त्रुटि मिल जाएगा:

उपयोग -boundingRectWithSize: विकल्प: विशेषताएं: संदर्भ :

मैं कैसे इस नई विधि के लिए मेरे पुराने संस्करण कन्वर्ट करने के लिए पता नहीं है और यह बहुत अच्छा होगा अगर कोई वह कर सकता है मुझे एलपी अग्रिम में धन्यवाद।

उत्तर

5

sizeWithFont तरीकों iOS7 में पदावनत किया गया। आपको इसके बजाय बाउंडिंग RectWithSize का उपयोग करना चाहिए। आप केवल iOS6 समर्थन कर रहे हैं

CGSize size = CGSizeZero; 

if ([label.text respondsToSelector: @selector(boundingRectWithSize:options:attributes:context:)] == YES) { 
    size = [label.text boundingRectWithSize: constrainedSize options: NSStringDrawingUsesLineFragmentOrigin 
           attributes: @{ NSFontAttributeName: label.font } context: nil].size; 
} else { 
    size = [label.text sizeWithFont: label.font constrainedToSize: constrainedSize lineBreakMode: UILineBreakModeWordWrap]; 
} 
2

आकारविथफॉन्ट एपीआई जिसका उपयोग आप कर रहे हैं आईओएस 7 पर बहिष्कृत है।

// See UIStringDrawing.h 
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:"); // NSTextAlignment is not needed to determine size 

तुम इतनी तरह एपीआई सुझाव का उपयोग कर सकते हैं:

NSMutableDictionary *atts = [[NSMutableDictionary alloc] init]; 
[atts setObject:myFont forKey:NSFontAttributeName]; 

CGRect rect = [myText boundingRectWithSize:constraint 
           options:NSStringDrawingUsesLineFragmentOrigin 
           attributes:atts 
           context:nil]; 
4

और बाद में, आप अपने NSStringsNSAttributedStrings में बदल सकते हैं और प्रयोग NSAttributedString के boundingRectWithSize:options:context:: आप भी पहले आईओएस संस्करणों का समर्थन करने की जरूरत है, तो आप कोड निम्न का उपयोग कर सकते हैं।

कुछ ऐसा जो पहले इस तरह देखा:

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

एक तरफ ध्यान दें, चीजों को ऐसा करने का लाभ के रूप में:

CGSize size = [text sizeWithFont:font 
       constrainedToSize:(CGSize){maxWidth, CGFLOAT_MAX}]; 

आसानी से दोनों iOS6 और iOS7 में यह और काम करने के लिए परिवर्तित किया जा सकता है रास्ता है इसलिए ios6 में आपका टेक्स्ट आकार अब थ्रेड-सुरक्षित है। sizeWithFont:... की पुरानी विधियां UIStringDrawing से संबंधित थीं, जो एक ही समय में 0 थ्रेडपर दो धागे पर चलने पर क्रैश हो जाएंगी। Ios6 में, NSAttributedStrings के लिए नए एनएसएसटींग ड्रॉइंग फ़ंक्शंस का खुलासा किया गया था और boundingRectWithSize:... फ़ंक्शन थ्रेड सुरक्षित है। मुझे अनुमान है कि आईओएस 7 में, पुराने sizeWithFont:... कार्यों को बहिष्कृत कर दिया गया था।

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

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

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

CGFloat height = ceilf(size.height); 
CGFloat width = ceilf(size.width); 
संबंधित मुद्दे