पदावनत के लिए रिप्लेसमेंट -SizeWithFont: constrainedToSize: lineBreakMode: iOS 7 में?


146

IOS 7 में, विधि:

- (CGSize)sizeWithFont:(UIFont *)font
     constrainedToSize:(CGSize)size
         lineBreakMode:(NSLineBreakMode)lineBreakMode 

और विधि:

- (CGSize)sizeWithFont:(UIFont *)font

वंचित हैं। मैं कैसे बदल सकता हूँ

CGSize size = [string sizeWithFont:font
                 constrainedToSize:constrainSize
                     lineBreakMode:NSLineBreakByWordWrapping];

तथा:

CGSize size = [string sizeWithFont:font];

2
स्थानापन्न विधि है -sizeWithAttributes:
होप्लेक्स

ठीक है, धन्यवाद, लेकिन मैं कैसे एक NSDIctionary की तरह लेबल से एक फ़ॉन्ट का उपयोग कर सकते हैं? अगर मेरा कोड इस प्रकार है: sizeWithFont: customlabel.font; शून्य पूछें "sizeWithAttributes: <# (
NS ढलान

1
यहां बताया गया है कि आप विशेषताओं को कैसे परिभाषित कर सकते हैं, इसके आधिकारिक दस्तावेज हैं: developer.apple.com/library/ios/documentation/UIKit/Reference/…
holex

जवाबों:


219

आप यह कोशिश कर सकते हैं:

CGRect textRect = [text boundingRectWithSize:size
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:FONT}
                                 context:nil];

CGSize size = textRect.size;

बस एक "[UIFont फ़ॉन्ट ....]" के लिए "फॉंट" बदलें


13
और आप NSLineBreakByWordWrapping का उल्लेख कहां करते हैं? किसके पास गया?
user4951

32
NSLineBreakByWordWrappingएक के भीतर चला जाएगा NSParagraphStyle। उदाहरण के लिए: NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;विशेषताओं में आपको फिर जोड़ना होगा NSParagraphStyleAttributeName: paragraphStyle.copy...
फ्लोरियन फ्रेडरिक

1
@ मेरे मामले में पैराग्राफ जोड़ने का श्रेय NSLineBreakByWordWrapping के अलावा लाइन ब्रेक के साथ पैराग्राफ़ को जोड़ने के कारण सिर्फ एक लाइन के लिए आकार की गणना की जा सकती है ... कोई विचार?
manicaesar

9
यह मत भूलो कि boundingRectWithSize:options:attributes:context:भिन्नात्मक मूल्यों की वापसी होती है। आपको वास्तविक ऊंचाई / चौड़ाई प्राप्त करने के लिए ceil(textRect.size.height)और ceil(textRect.size.width)क्रमशः करने की आवश्यकता है ।
फ्लोरियन फ्रेडरिक

20
बिल्ली BOLIVIASize क्या है?
JRam13

36

जैसा कि हम सभी iOS के लिए sizeWithAttributes का उपयोग नहीं कर सकते, 4.3 से अधिक के लिए हमें 7.0 और पिछले iOS के लिए सशर्त कोड लिखना होगा।

1) समाधान 1:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
   CGSize size = CGSizeMake(230,9999);
   CGRect textRect = [specialityObj.name  
       boundingRectWithSize:size
                    options:NSStringDrawingUsesLineFragmentOrigin
                 attributes:@{NSFontAttributeName:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14]}
                    context:nil];
   total_height = total_height + textRect.size.height;   
}
else {
   CGSize maximumLabelSize = CGSizeMake(230,9999); 
   expectedLabelSize = [specialityObj.name sizeWithFont:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; //iOS 6 and previous. 
   total_height = total_height + expectedLabelSize.height;
}

2) समाधान 2

UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16]; // Your Font-style whatever you want to use.
gettingSizeLabel.text = @"YOUR TEXT HERE";
gettingSizeLabel.numberOfLines = 0;
CGSize maximumLabelSize = CGSizeMake(310, 9999); // this width will be as per your requirement

CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

पहला उपाय यह है कि ऊंचाई के उचित मूल्य को वापस करने में कुछ समय विफल है। इसलिए दूसरे उपाय का उपयोग करें। जो पूरी तरह से काम करेगा।

दूसरा विकल्प सशर्त कोड के बिना सभी आईओएस में काफी अच्छी तरह से और आसानी से काम कर रहा है।


1
230, 999 क्यों? आपको नंबर कहां मिलता है>
user4951

1
230 कोई भी संख्या हो सकती है। यह आपके लेबल के लिए इच्छित चौड़ाई का प्रतिनिधित्व करता है। ९९९९ मैं बल्कि सूचना या MAXFLOAT के साथ बदलूँगा।
फ्लोरियन फ्रेडरिक

दूसरा समाधान एक आकर्षण की तरह काम कर रहा है। धन्यवाद नीरव
जिम

1
"[AppHandlers zHandler]" एक त्रुटि देता है .. "अघोषित पहचानकर्ता"। कैसे हल करें?
डिंपल

9

यहाँ सरल समाधान है:

आवश्यकताएँ:

CGSize maximumSize = CGSizeMake(widthHere, MAXFLOAT);
UIFont *font = [UIFont systemFontOfSize:sizeHere];

अब जैसा कि iOS 7.0constrainedToSizeusage:lineBreakMode: में उपयोग घटाया गया है :

CGSize expectedSize = [stringHere sizeWithFont:font constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping];

अब iOS 7.0 के अधिक संस्करण में उपयोग होगा:

// Let's make an NSAttributedString first
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:stringHere];
//Add LineBreakMode
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
[paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
[attributedString setAttributes:@{NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(0, attributedString.length)];
// Add Font
[attributedString setAttributes:@{NSFontAttributeName:font} range:NSMakeRange(0, attributedString.length)];

//Now let's make the Bounding Rect
CGSize expectedSize = [attributedString boundingRectWithSize:maximumSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;

7

नीचे दो सरल विधियाँ दी गई हैं जो इन दो पदावनत विधियों को प्रतिस्थापित करेंगी।

और यहाँ प्रासंगिक संदर्भ हैं:

यदि आप NSLineBreakByWordWrapping का उपयोग कर रहे हैं, तो आपको NSParagraphStyle को निर्दिष्ट करने की आवश्यकता नहीं है, क्योंकि वह डिफ़ॉल्ट है: https://developer.apple.com/library/mac/documentation/Ceoa/Reference/ApplicationKit/Classes/NSParagraphStyle_indass_indass। एचटीएमएल # // apple_ref / OCC / clm / NSParagraphStyle / defaultParagraphStyle

अपग्रेड किए गए तरीकों के परिणामों से मिलान करने के लिए, आपको आकार का छत प्राप्त करना होगा। https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/#//apple_ref/occ/instm/NSString/boundRectWithSize:options:attributes:context :

+ (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font {    
    CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}];
    return CGSizeMake(ceilf(size.width), ceilf(size.height));
}

+ (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{
    CGRect textRect = [text boundingRectWithSize:size
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:@{NSFontAttributeName: font}
                                     context:nil];
    return CGSizeMake(ceilf(textRect.size.width), ceilf(textRect.size.height));
}

6

ज्यादातर मामलों में मैंने विधि आकार का उपयोग किया है WithFont: constrainedToSize: lineBreakMode: एक UILabel के लिए न्यूनतम आकार का अनुमान लगाने के लिए इसके पाठ को समायोजित करने के लिए (विशेषकर जब लेबल को UITBViewCell के अंदर रखा जाना है) ...

... यदि यह ठीक आपकी स्थिति है तो आप विधि का उपयोग कर सकते हैं:

CGSize size = [myLabel textRectForBounds:myLabel.frame limitedToNumberOfLines:mylabel.numberOfLines].size;

आशा है कि यह मदद कर सकता है।


5
ऐप्पल के प्रलेखन का कहना है कि आपको इस पद्धति को सीधे कॉल नहीं करना चाहिए।
बार्लो टकर

आईओएस 7 एसडीके प्रलेखन में कम से कम उल्लेख नहीं किया गया है।
नदी

3
UIFont *font = [UIFont boldSystemFontOfSize:16];
CGRect new = [string boundingRectWithSize:CGSizeMake(200, 300) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil];
CGSize stringSize= new.size;

3
StackOverFlow में आपका स्वागत है। फिर से वही जवाब पोस्ट न करें। यदि आपको उत्तर में कुछ जोड़ने की आवश्यकता है, तो टिप्पणी करें या उत्तर को संपादित करें।
रामराज टी।

ठीक है..मैं अगली बार उस पर ध्यान दूंगा। आपकी सलाह के लिए धन्यवाद।
user3575114

2

[स्वीकृत जवाब एक श्रेणी में अच्छी तरह से काम करता है। मैं पदावनत विधि नामों को अधिलेखित कर रहा हूं। यह एक अच्छा विचार है? Xcode 6.x में कोई शिकायत नहीं के साथ काम करने लगता है]

यह काम करता है यदि आपका परिनियोजन लक्ष्य 7.0 या अधिक है। श्रेणी हैNSString (Util)

NSString + Util.h

- (CGSize)sizeWithFont:(UIFont *) font;
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size;

NSString + Util.m

- (CGSize)sizeWithFont:(UIFont *) font {
    NSDictionary *fontAsAttributes = @{NSFontAttributeName:font};
    return [self sizeWithAttributes:fontAsAttributes];
}

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size {
    NSDictionary *fontAsAttributes = @{NSFontAttributeName:font};
    CGRect retVal = [self boundingRectWithSize:size
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:fontAsAttributes context:nil];
    return retVal.size;
}

0
UIFont *font = [UIFont fontWithName:@"Courier" size:16.0f];

NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
paragraphStyle.alignment = NSTextAlignmentRight;

NSDictionary *attributes = @{ NSFontAttributeName: font,
                    NSParagraphStyleAttributeName: paragraphStyle };

CGRect textRect = [text boundingRectWithSize:size
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:attributes
                                 context:nil];

CGSize size = textRect.size;

दो जवाब 1 + 2 से

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