sizeWithFont विधि पदावनत है। boundingRectWithSize एक अप्रत्याशित मान लौटाता है


82

IOS7 में, sizeWithFontपदावनत किया जाता है, इसलिए मैं उपयोग कर रहा हूं boundingRectWithSize(जो CGRect मान लौटाता है)। मेरा कोड:

 UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
                    // you can use your font.

 CGSize maximumLabelSize = CGSizeMake(310, 9999);

 CGRect textRect = [myString boundingRectWithSize:maximumLabelSize   
                             options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{NSFontAttributeName:fontText}
                             context:nil];

 expectedLabelSize = CGSizeMake(textRect.size.width, textRect.size.height);

जब textRectमैं उपयोग कर रहा होता हूं, तो मैं अपने आकार से बड़ा maximumLabelSize, भिन्न आकार का हो रहा हूं sizeWithFont। मेरे द्वारा इस समस्या का समाधान कैसे किया जा सकता है?


मुझे यह समस्या सभी फोंट के साथ मिल रही है, न केवल सिस्टम फॉन्ट या हेल्वेटिका।
नीरव जैन

क्या आपको पता है कि कैसे करना है?
नीरव जैन

फ़ॉन्ट नाम, पाठ और बेमेल आकारों के लिए ठोस उदाहरण सहायक हो सकता है।
ईको

मैं हमेशा सही ऊँचाई लौटाने वाले एट्रिडस्ट्रीमिंग की ऊंचाई की गणना के लिए iOS6 में CTFramesetterSuggestFrameSizeWithConstraints का उपयोग करता था। IOS7 में, दोनों CTFramesetterSuggestFrameSizeWithConstraints और boundingRectWithSize ने मुझे गलत ऊंचाई का परिणाम दिया। मुझे यकीन है कि यह iOS7 में पेश किया गया बग है और यह अभी तक कोई समाधान नहीं है।
अर्नोल्ड टैंग

Im भी एक ही समस्या का सामना करना पड़ रहा है इसका बेहतर उपयोग करने के लिए tttattributedlabel
Sri ..

जवाबों:


151

कैसे नए लेबल बनाने और उपयोग करने के बारे में sizeThatFit:(CGSize)size??

UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:@"YOUR FONT's NAME" size:16];
gettingSizeLabel.text = @"YOUR LABEL's TEXT";
gettingSizeLabel.numberOfLines = 0;
gettingSizeLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);

CGSize expectSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

संपादित करें: यह ऊपरी कोड ios 7 और इसके बाद के संस्करण के लिए अच्छा नहीं है, इसलिए कृपया नीचे का उपयोग करें:

CGRect textRect = [myString boundingRectWithSize:maximumLabelSize   
                         options:NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingUsesFontLeading
                         attributes:@{NSFontAttributeName:fontText}
                         context:nil];

यह विधि तब काम नहीं कर रही है जब मैं स्ट्रिंग में HTML संस्थाओं को जोड़ रहा हूं (<OL>, <LI>)।
नीरव जैन

कृपया मेरे उत्तर की फिर से जाँच करें! मैं नंबरऑफलाइन संपत्ति से चूक गया! माफ़ करना!
क्वांग Hà

1
घंटों और घंटों की खोज, प्रयोग और डेड-एंड के बाद, यह एकमात्र समाधान है जो iOS7 और Xamarin / Monotouch के लिए काम करता है
माइकल रोड्रिग्स

26
फ़ॉन्ट के लिए आकार की गणना करने के लिए लेबल बनाना? इतना बेकार है!
ओस्सिर

13
@Ossir, क्या आपके पास एक बेहतर विचार है?
लूडा

36

हो सकता है कि आपको इस उत्तर में सुझाई गई विधि के लिए अतिरिक्त विकल्प प्रदान करने की आवश्यकता हो :

CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize   
                                         options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                      attributes:@{NSFontAttributeName: fontText}
                                         context:nil];

3
ऐसा लग रहा है कि boundingRectWithSizeटूट गया है। मैंने iOS 7, 7.1.1 पर परीक्षण किया और यह सही परिणाम नहीं देता है।
राफेल

यह मेरे लिए काम नहीं करता था, हालांकि एक NSAttributedString पर बाउंडिंग रेक्टविथ वाइज का उपयोग करते हुए और मेरे फ़ॉन्ट विशेषता को स्ट्रिंग में जोड़ने के बजाय काम किया।
भेड़दोगशीप

12
दोस्तों, Apple स्टेटमेंट के बारे में मत भूलना: iOS 7 और बाद में, यह विधि आंशिक आकार (लौटे CGRect के आकार के घटक में) को लौटाती है; विचारों को आकार देने के लिए लौटे आकार का उपयोग करने के लिए, आपको छत फ़ंक्शन का उपयोग करके इसके मूल्य को निकटतम उच्च पूर्णांक तक बढ़ाने के लिए उपयोग करना चाहिए।
सॉफ्टडिजेनर

2
छत मेरे लिए पर्याप्त नहीं थी, लेकिन यह पाया कि
छत

15

यहाँ मेरा काम कोड स्निपेट है:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict];

NSString *headline  = [dict objectForKey:@"title"];  
UIFont *font        = [UIFont boldSystemFontOfSize:18];  
CGRect  rect        = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];

CGFloat height      = roundf(rect.size.height +4)

मैंने गणना की ऊँचाई में 4px जोड़ा, क्योंकि इन 4px के बिना, एक पंक्ति गायब है।

मैं एक टेबल व्यू में इस कोड स्निपेट का उपयोग करता हूं और "ऊंचाई" को NSNumbers की एक सरणी में जोड़ता हूं और मुझे डिफ़ॉल्ट टेक्स्टलेबेल के लिए सही सेल ऊंचाई मिलती है।

यदि आप पाठ में पाठ के तहत अधिक स्थान चाहते हैं, तो 4 और पिक्सेल जोड़ें।

**** अपडेट करें ****

मैं "40px की चौड़ाई बग" से सहमत नहीं हूं, मैं लापता ऊंचाई की 4px हूं, क्योंकि 4px एक अक्षर और एक पंक्ति के बीच की जगह की डिफ़ॉल्ट ऊंचाई है। आप इसे UILabel के साथ देख सकते हैं, 16 के फ़ॉन्टाइज़ के लिए आपको 20 की UILabel ऊंचाई की आवश्यकता है।

लेकिन अगर आपकी अंतिम पंक्ति में कोई "g" या उसमें कुछ भी नहीं है, तो माप को 4px ऊंचाई से याद किया जा सकता है।

मैंने इसे थोड़ी विधि के साथ रीचेक किया, मुझे अपने लेबल के लिए 20,40 या 60 की सटीक ऊँचाई और 300px से कम सही चौड़ाई मिली।

IOS6 और iOS7 का समर्थन करने के लिए, आप मेरे तरीके का उपयोग कर सकते हैं:

- (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
    CGRect rect;

    float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (iosVersion >= 7.0) {
        rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
    }
    else {
        CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
        rect = CGRectMake(0, 0, size.width, size.height);
    }
    NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height);
    return rect.size.height;
}

**** UPGRADE ****

आपकी टिप्पणियों के लिए धन्यवाद, मैंने अपने कार्य को आगे बढ़ाया। चूंकि sizeWithFont को हटा दिया गया है और आपको XCode में एक चेतावनी मिलेगी, इसलिए मैंने इस विशेष फ़ंक्शन-कॉल / कोड के ब्लॉक के लिए चेतावनी को हटाने के लिए नैदानिक-व्यावहारिक-कोड जोड़ा।

- (CGFloat)heightFromStringWithFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
    CGRect rect;

    if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
        rect = [self boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
    }
    else {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
        CGSize size = [self sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
        rect = CGRectMake(0, 0, size.width, size.height);
#pragma GCC diagnostic pop
    }
    return ceil(rect.size.height);
}

4px विषय के अलावा: आप किस फ़ॉन्ट और फ़ॉन्ट-वजन का उपयोग करते हैं, परिकलन अलग-अलग ऊँचाई-मान देता है। मेरे मामले में: 16.0 के एक फ़ॉन्ट के साथ HelveticaNeue- मध्यम एक पंक्ति के लिए 20.0 की एक पंक्ति-ऊँचाई देता है, लेकिन दो पंक्तियों के लिए 39.0, 4 लाइनों के लिए 78px -> प्रत्येक पंक्ति के लिए 1px गायब - पंक्ति 2 से शुरू - लेकिन आप चाहते हैं आपके पास हर पंक्ति के लिए अपना फॉन्टसाइज़ + 4px लाइनेस्पेस है, जिसके लिए आपको एक ऊँचाई-परिणाम प्राप्त करना है।
कृपया ध्यान रखें कि कोडिंग करते समय!
मेरे पास इस "समस्या" के लिए अभी तक एक फ़ंक्शन नहीं है, लेकिन जब मैं समाप्त कर लूंगा तो मैं इस पोस्ट को अपडेट करूंगा।


1
आपको संभवतः एक फ्लोट मान की जांच करने के बजाय [पाठ प्रतिसादों का उपयोग करता है: @selector (बाउंडिंग रेक्टविथसाइज़: विकल्प: विशेषताएँ: संदर्भ :)]।
सामह

1
+ 4pt के बजाय छत समारोह का उपयोग करना बेहतर है, इस उत्तर को देखें stackoverflow.com/a/23563152/667483
surfrider

2

अगर मैं सही तरीके से समझूं, तो आप बाउंडिंग रेक्टविथसाइज़ का उपयोग कर रहे हैं: आकार प्राप्त करने के तरीके के रूप में आपको साइज़ विथ फ़ोंट (जिसका अर्थ है कि आप सीधे सीजीएसइज़ चाहते हैं, सीजीआरजी नहीं)?

ऐसा लगता है कि आप क्या देख रहे हैं:

पदावनत आकार के लिए प्रतिस्थापनWithFont: iOS 7 में?

वे sizeWithAttributes का उपयोग कर रहे हैं: आकार पाने के लिए, sizeWithFont के प्रतिस्थापन के रूप में।

क्या आप अभी भी कुछ इस तरह का उपयोग करके गलत आकार प्राप्त करते हैं:

UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
                    // you can use your font.

expectedLabelSize = [myString sizeWithAttributes:@{NSFontAttributeName:fontText}];

लेकिन मैं CGSize का अधिकतम उपयोग कैसे कर सकता हूं = CGSizeMake (310, 9999)? मुझे सही ऊंचाई और चौड़ाई चाहिए।
नीरव जैन

1
क्या कोई विशेषता है जो sizeWithAttributes को बताती है: इसकी चौड़ाई / ऊँचाई को कम करने के लिए?
नीरव जैन

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

2
वह sizeWithFont का उपयोग कर रहा था: constrainedToSize: lineBreakMode: और constWedToSize मान को sizeWithAttributes पास करने का कोई तरीका नहीं है।
ज़ी।

2

@ SoftDesigner की टिप्पणी ने मेरे लिए काम किया है

CGRect descriptionRect = [description boundingRectWithSize:CGSizeMake(width, 0)
                                                       options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                                    attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:12]}
                                                       context:nil];
result = ceil(descriptionRect.size.height);

1

लेबल रन टाइम के आकार को खोजने के लिए sizewithfont को iOS 7.0 के लिए पदावनत किया जाता है, इसके बजाय आपको -गर्मिंग का उपयोग करना होगाविकल्प: विकल्प: विशेषताएँ: संदर्भ: विधि

आप इसे नीचे दिए गए कोड की तरह उपयोग कर सकते हैं

CGSize constraint = CGSizeMake(MAXIMUM_WIDHT, TEMP_HEIGHT);
NSRange range = NSMakeRange(0, [[self.message body] length]);

NSDictionary *attributes = [YOUR_LABEL.attributedText attributesAtIndex:0 effectiveRange:&range];
CGSize boundingBox = [myString boundingRectWithSize:constraint options:NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;
int numberOfLine = ceil((boundingBox.width) / YOUR_LABEL.frame.size.width);
CGSize descSize = CGSizeMake(ceil(boundingBox.width), ceil(self.lblMessageDetail.frame.size.height*numberOfLine));

CGRect frame=YOUR_LABEL.frame;
frame.size.height=descSize.height;
YOUR_LABEL.frame=frame;

यहां आपको ऊंचाई या चौड़ाई खोजने के लिए अधिकतम लंबाई में चौड़ाई देनी होगी।

यह कोशिश करो यह मेरे लिए काम कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.