दिलचस्प पोस्ट
रीटरफिट लाइब्रेरी में टाइमआउट कैसे सेट करें? विजुअल स्टूडियो 2010 में कमांड लाइन आर्गिजेंस पास करना? javax.net.ssl.SSLHandshakeException: वेब सेवा संचार के दौरान रिमोट होस्ट को हैंडशेक के दौरान बंद कर दिया गया एक एकल अक्षर स्ट्रिंग के रूप में टेक्स्ट फ़ाइल आयात करें सॉकेट.ओ 1.0 में कक्ष की क्लाइंट सूची कैसे प्राप्त करें java.lang.IllegalArgumentException: अवैध <url-pattern> सर्वलेट मैपिंग में क्यों JVM अभी भी पूंछ कॉल अनुकूलन का समर्थन नहीं करता है? एक काल्पनिक क्षेत्र के चारों ओर वस्तु को देखकर SCNCamera नोड को घुमाएं == के साथ तार की तुलना करना जो कि जावा में अंतिम घोषित किया गया है मैं किसी स्वरूपित प्रारूप में बिना किसी प्रारूप के दूसरे दिनांक में दूसरे प्रारूप में तिथि कैसे बदल सकता हूँ? सी # स्ट्रिंग की जगह काम नहीं करता विंडोज 7 पर एंड्रॉइड स्टूडियो इंस्टॉलेशन विफल रहता है, कोई जेडीके नहीं मिला TypeError: 'मॉड्यूल' ऑब्जेक्ट कॉल करने योग्य नहीं है Google ReCAPTCHA कैसे आवश्यक हो? UIImage गोल कोनों

कैसे UILabel ऊँचाई गतिशील गणना करने के लिए?

मैं एक ही के लिए दिए गए पाठ से गतिशील रूप से लाइनों और यूआईएलबल की ऊंचाई की गणना करना चाहता हूं।

वेब के समाधान से एकत्रित समाधान "कैसे UILabel ऊँचाई गतिशील गणना करने के लिए?"

इसे इस्तेमाल करे

// UILabel *myLabel; CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font constrainedToSize:myLabel.frame.size lineBreakMode:NSLineBreakByWordWrapping]; CGFloat labelHeight = labelSize.height; int lines = [myLabel.text sizeWithFont:myLabel.font constrainedToSize:myLabel.frame.size lineBreakMode:NSLineBreakByWordWrapping].height/16; // '16' is font size 

या

 int lines = labelHeight/16; NSLog(@"lines count : %i \n\n",lines); 

या

 int lines = [myLabel.text sizeWithFont:myLabel.font constrainedToSize:myLabel.frame.size lineBreakMode:UILineBreakModeWordWrap].height /myLabel.font.pointSize; //fetching font size from font 

श्रेणियों का उपयोग करके, बस के रूप में नाम श्रेणी वर्ग बनाएँ

UILabel + UILabelDynamicHeight.h

UILabel + UILabelDynamicHeight.m

ऊंचाई गणना के बारे में कोई और तनाव नहीं। कृपया नीचे क्रियान्वयन की समीक्षा करें।

IOS7 के लिए अपडेट और ऊपर, IOS 7 नीचे: गतिशील रूप से UILabel ऊंचाई की गणना करें

 #define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame) #define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending) #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) #define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) #define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending) #define iOS7_0 @"7.0" 

UILabel + UILabelDynamicHeight.h

 #import <UIKit/UIKit.h> @interface UILabel (UILabelDynamicHeight) #pragma mark - Calculate the size the Multi line Label /*====================================================================*/ /* Calculate the size of the Multi line Label */ /*====================================================================*/ /** * Returns the size of the Label * * @param aLabel To be used to calculte the height * * @return size of the Label */ -(CGSize)sizeOfMultiLineLabel; @end 

UILabel + UILabelDynamicHeight.m

 #import "UILabel+UILabelDynamicHeight.h" @implementation UILabel (UILabelDynamicHeight) #pragma mark - Calculate the size,bounds,frame of the Multi line Label /*====================================================================*/ /* Calculate the size,bounds,frame of the Multi line Label */ /*====================================================================*/ /** * Returns the size of the Label * * @param aLabel To be used to calculte the height * * @return size of the Label */ -(CGSize)sizeOfMultiLineLabel{ //Label text NSString *aLabelTextString = [self text]; //Label font UIFont *aLabelFont = [self font]; //Width of the Label CGFloat aLabelSizeWidth = self.frame.size.width; if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) { //version < 7.0 return [aLabelTextString sizeWithFont:aLabelFont constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping]; } else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) { //version >= 7.0 //Return the calculated size of the Label return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName : aLabelFont } context:nil].size; } return [self bounds].size; } @end 

-sizeToFit इंस्टेंस पर कॉलिंग- -sizeToFit स्वचालित रूप से इसे प्रदर्शित होने वाले पाठ को फ़िट करने के लिए इसका आकार बदल देगा, कोई आवश्यक गणना नहीं करेगा। यदि आपको आकार की आवश्यकता है, तो आप इसे लेबल की फ्रेम की संपत्ति से उसके बाद प्राप्त कर सकते हैं

 label.numberOfLines = 0; // allows label to have as many lines as needed label.text = @"some long text"; [label sizeToFit]; NSLog(@"Label's frame is: %@", NSStringFromCGRect(label.frame)); 

संक्षेप करने के लिए, आप अपनी स्ट्रिंग का उपयोग करके लेबल की ऊंचाई की गणना कर सकते हैं और कॉलिंग boundingRectWithSize । आपको font को एक विशेषता के रूप में प्रदान करना होगा, और मल्टी-लाइन लेबल्स के लिए .usesLineFragmentOrigin शामिल करना चाहिए।

 let labelWidth = label.frame.width let maxLabelSize = CGSize(width: labelWidth, height: CGFloat.greatestFiniteMagnitude) let actualLabelSize = label.text!.boundingRect(with: maxLabelSize, options: [.usesLineFragmentOrigin], attributes: [NSFontAttributeName: label.font], context: nil) let labelHeight = actualLabelSize.height 

ऐसा करने के लिए कुछ एक्सटेंशन:

स्विफ्ट वर्शन:

 extension UILabel { func textHeight(for width: CGFloat) -> CGFloat { guard let text = text else { return 0 } return text.height(for: width, font: font) } func attributedTextHeight(for width: CGFloat) -> CGFloat { guard let attributedText = attributedText else { return 0 } return attributedText.height(for: width) } } extension String { func height(for width: CGFloat, font: UIFont) -> CGFloat { let maxSize = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) let actualSize = self.boundingRect(for: maxSize, options: [.usesLineFragmentOrigin], attributes: [NSFontAttributeName: font], context: nil) return actualSize.height } } extension NSAttributedString { func height(for width: CGFloat) -> CGFloat { let maxSize = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) let actualSize = boundingRect(for: maxSize, options: [.usesLineFragmentOrigin], context: nil) return actualSize.height } } 

उद्देश्य-सी संस्करण:

UILabel + Utility.h

 #import <UIKit/UIKit.h> @interface UILabel (Utility) - (CGFloat)textHeightForWidth:(CGFloat)width; - (CGFloat)attributedTextHeightForWidth:(CGFloat)width; @end 

UILabel + Utility.m

 @implementation NSString (Utility) - (CGFloat)heightForWidth:(CGFloat)width font:(UIFont *)font { CGSize maxSize = CGSizeMake(width, CGFLOAT_MAX); CGSize actualSize = [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil].size; return actualSize.height; } @end @implementation NSAttributedString (Utility) - (CGFloat)heightForWidth:(CGFloat)width { CGSize maxSize = CGSizeMake(width, CGFLOAT_MAX); CGSize actualSize = [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size; return actualSize.height; } @end @implementation UILabel (Utility) - (CGFloat)textHeightForWidth:(CGFloat)width { return [self.text heightForWidth:width font:self.font]; } - (CGFloat)attributedTextHeightForWidth:(CGFloat)width { return [self.attributedText heightForWidth:width]; } @end 

वर्तमान समाधान आईओएस 7 के रूप में नापसंद किया गया है

यहां एक अद्यतन समाधान है:

 + (CGFloat)heightOfCellWithIngredientLine:(NSString *)ingredientLine withSuperviewWidth:(CGFloat)superviewWidth { CGFloat labelWidth = superviewWidth - 30.0f; // use the known label width with a maximum height of 100 points CGSize labelContraints = CGSizeMake(labelWidth, 100.0f); NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init]; CGRect labelRect = [ingredientLine boundingRectWithSize:labelContraints options:NSStringDrawingUsesLineFragmentOrigin attributes:nil context:context]; // return the calculated required height of the cell considering the label return labelRect.size.height; } 

इसका कारण यह है कि मेरा समाधान इस तरह स्थापित है क्योंकि मैं एक UITableViewCell का उपयोग कर रहा हूं और सेल को गतिशील रूप से रिसाइज़ कर रहा हूं जिसके लेबल के ऊपर कितना कमरा होगा

आकार बुलाए बिना, आप बहुत सारे प्लग और प्ले समाधान के साथ यह सभी संख्यात्मक रूप से कर सकते हैं:

 + (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width { CGSize size = [text sizeWithAttributes:@{NSFontAttributeName:font}]; CGFloat area = size.height * size.width; CGFloat height = roundf(area / width); return ceilf(height / font.lineHeight) * font.lineHeight; } 

मैं इसे UITableViewCells के लिए बहुत कुछ उपयोग करता हूं जो गतिशील रूप से आवंटित ऊंचाइयों के लिए हैं I

गुणों की समस्या को हल करता है @ सल्मान जैदी

 CGSize maxSize = CGSizeMake(lbl.frame.size.width, CGFLOAT_MAX); CGSize requiredSize = [lbl sizeThatFits:maxSize]; CGFloat height=requiredSize.height 

इस पद्धति की प्रतिलिपि बनाएं और चिपकाएं और इसे इस्तेमाल किया जाएगा:

 [lblText setFrame:CGRectMake(lblText.frame.origin.x, lblText.frame.origin.y, width, [self getLabelHeight:lblText])]; - (CGFloat)getLabelHeight:(UILabel*)label { CGSize constraint = CGSizeMake(label.frame.size.width, CGFLOAT_MAX); CGSize size; NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init]; CGSize boundingBox = [label.text boundingRectWithSize:constraint options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:label.font} context:context].size; size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height)); return size.height; } 

मेरे मामले में, मैं प्रत्येक अनुभाग के लिए एक निश्चित आकार के शीर्षलेख का उपयोग कर रहा था लेकिन प्रत्येक हेडर में गतिशील रूप से सेल आकार के साथ। सेल की ऊंचाई, लेबल की ऊंचाई पर निर्भर करता है।

के साथ काम करना:

 tableView.estimatedRowHeight = SomeNumber tableView.rowHeight = UITableViewAutomaticDimension 

काम करता है, लेकिन जब उपयोग:

 tableView.reloadSections(IndexSet(integer: sender.tag) , with: .automatic) 

जब बहुत सारे हेडर ढहते नहीं हैं, तो कई तरह की .none पैदा होती हैं जैसे हेडर दोहराव (एक ही प्रकार से नीचे हैडर का प्रकार x) और अजीब एनीमेशन जब फ्रेमवर्क एनीमेशन के साथ पुनः लोड होता है, यहां तक ​​कि जब भी प्रकार के साथ प्रयोग करते हैं। .none ( .none , एक निश्चित हैडर ऊंचाई और सेल ऊंचाई काम करता है)।

समाधान ऊंचाई heightForRowAt कॉलबैक का उपयोग कर रहा है और आपके स्व द्वारा लेबल की ऊंचाई की गणना करता है (साथ ही एनीमेशन बहुत अच्छा दिखता है )। याद रखें कि ऊंचाई को पहली बार कहा जा रहा है

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { let object = dataDetailsController.getRowObject(forIndexPath: indexPath) let label = UILabel(frame: tableView.frame) let font = UIFont(name: "HelveticaNeue-Bold", size: 25) label.text = object?.name label.font = font label.numberOfLines = 0 label.textAlignment = .center label.sizeToFit() let size = label.frame.height return Float(size) == 0 ? 34 : size } 

यह वह एक्सटेंशन है जिसे मैं बहु-लाइन यूआईएलबल ऊंचाइयों की गणना के लिए उपयोग करता हूं, यह पिछले स्टैक अतिप्रवाह पोस्ट से एक एडजस्टेड स्निपेट है:

 extension UILabel { func estimatedHeight(forWidth: CGFloat, text: String, ofSize: CGFloat) -> CGFloat { let size = CGSize(width: forWidth, height: CGFloat(MAXFLOAT)) let options = NSStringDrawingOptions.usesFontLeading.union(.usesLineFragmentOrigin) let attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: ofSize)] let rectangleHeight = String(text).boundingRect(with: size, options: options, attributes: attributes, context: nil).height return ceil(rectangleHeight) } } 

आपको स्ट्रिंग का एक एक्सटेंशन बनाने और इस विधि को कॉल करने की आवश्यकता है

func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat { let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude) let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) return ceil(boundingBox.height) }

आपको अपने लेबल की चौड़ाई भेजनी होगी

यदि आप लेबल को गतिशील लाइनें लेना चाहते हैं तो आप इसका उपयोग कर सकते हैं

 label.numberOfLines = 0; // allows label to have as many lines as needed label.text = @"some long text "; [label sizeToFit]; NSLog(@"Label's frame is: %@", NSStringFromCGRect(label.frame));