यहाँ मेरा काम कोड स्निपेट है:
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 लाइनेस्पेस है, जिसके लिए आपको एक ऊँचाई-परिणाम प्राप्त करना है।
कृपया ध्यान रखें कि कोडिंग करते समय!
मेरे पास इस "समस्या" के लिए अभी तक एक फ़ंक्शन नहीं है, लेकिन जब मैं समाप्त कर लूंगा तो मैं इस पोस्ट को अपडेट करूंगा।