UILabel - पाठ को फिट करने के लिए ऑटो-आकार का लेबल?


144

क्या निहित पाठ को फिट करने के लिए यूआईबेल बॉक्स / सीमा को ऑटो-आकार देना संभव है? (मुझे परवाह नहीं है कि यह प्रदर्शन से बड़ा है)

इसलिए यदि कोई उपयोगकर्ता "हैलो" में प्रवेश करता है या "मेरा नाम वास्तव में लंबा है, तो मैं चाहता हूं कि वह इस बॉक्स में फिट हो", यह कभी भी छोटा नहीं होता है और लेबल तदनुसार 'चौड़ा' होता है?


कृपया किसी को भी स्विफ्ट कोड प्रदान करने में मेरी मदद करें ..
एंजेल एफ साइरस

जवाबों:


98

कृपया मेरे जिस्ट की जांच करें जहां मैंने UILabelकुछ समान के लिए एक श्रेणी बनाई है , मेरी श्रेणी UILabelसभी सामग्री को दिखाने के लिए एक ऊँचाई देती है: https://gist.github.com/1005520

या इस पोस्ट को देखें: https://stackoverflow.com/a/7242981/662605

यह ऊंचाई को बढ़ाएगा, लेकिन आप इसे दूसरी तरह से काम करने के लिए आसानी से बदल सकते हैं और चौड़ाई को कुछ इस तरह से बढ़ा सकते हैं, जो मुझे विश्वास है कि आप क्या करना चाहते हैं:

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

आप क्लास sizeToFitसे उपलब्ध विधि का अधिक उपयोग कर सकते हैं UIView, लेकिन सुरक्षित रहने के लिए लाइनों की संख्या को 1 पर सेट करें।


iOS 6 अपडेट

यदि आप AutoLayout का उपयोग कर रहे हैं, तो आपके पास एक अंतर्निहित समाधान है। रेखाओं की संख्या को 0 पर सेट करके, फ्रेमवर्क आपके लेबल को आपके पाठ को फिट करने के लिए उचित रूप से (अधिक ऊंचाई जोड़कर) आकार देगा।


iOS 8 अपडेट

sizeWithFont:sizeWithAttributes:इसके बजाय पदावनत किया जाता है:

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}

8
IOS 6 ऑटोलेयूट विधि का उपयोग करके मैंने अपने लेबल पर एक ऊँचाई की कमी के साथ समाप्त कर दिया जिससे मैं छुटकारा नहीं पा सका। ऊंचाई के अवरोध को 'ग्रेटर थान या इक्वल' के संबंध में स्थापित करने से ऊंचाई बढ़ने की अनुमति मिली।
माइकल ल्यूटन

2
sizeWithFont: constrainedToSize: lineBreakMode: विधि ios 7 में
समाप्त हो गई

1
पाठ के कम / अधिक होने पर UILabel खुद को आकार नहीं दे रहा है। मैं ऑटो-लेआउट का उपयोग कर रहा हूं। UILabel बनाने की कोशिश की गई, लेकिन वे हर बार बनाए जाते हैं सेलफोररॉइट इंडेक्स की शुरुआत होती है। खूब बातें की। मेरे लिए कुछ भी काम नहीं कर रहा है। उलाबेल की पृष्ठभूमि समान चौड़ाई लेती है। मदद !!!
कोरडेविस

@ डैनियल मैं लाइनों की संख्या = 0 सेट करता हूं, लेकिन इसके काम नहीं कर रहा है। मैंने क्षैतिज और लंबवत केंद्र की बाधाओं को निर्धारित किया है। एक अतिरिक्त चीज जो मैंने की है, उसे UILABEL का उपवर्ग बनाया गया है और इसे उस लेबल के लिए इस्तेमाल किया जा रहा है
जसमीत

Autolayout सबसे सरल समाधान के साथ: (1) लाइन को 0 पर सेट करें, (2) लगातार चौड़ाई को "ग्रेटर थान या समान" पर सेट करें, लगातार 0 के साथ, (3) सेट की ऊँचाई की कसौटी पर "ग्रेटर थान या समान" के साथ, 0 4) जैसा कि आप आमतौर पर क्षैतिज और लंबवत रूप से केंद्रित करके करते हैं, संरेखित करें।
एरिक वैन डेर नीट

76

उपयोग [label sizeToFit];करने से डेनियल श्रेणी से एक ही परिणाम प्राप्त होगा।

हालांकि मैं ऑटोलेयूट का उपयोग करने की सलाह देता हूं और लेबल को बाधाओं के आधार पर आकार बदलने देता हूं।


3
स्विफ्ट का उपयोग करते समय मुझे इसे डिस्पैच_ससंक (dispatch_get_main_queue (), {}) का उपयोग करके मुख्य थ्रेड पर चलाना था;
Zeezer

@Zeezer क्या आप जानते हैं क्यों?
फर्लोस्क

13
@FurloSK ui पर कोई भी बदलाव मुख्य सूत्र में किया जाना चाहिए।
गुइलहर्मे टोरेस कास्त्रो

32

यदि हम चाहते हैं कि UILabelपाठ आकार के आधार पर सिकुड़ना और विस्तार होना चाहिए तो ऑटोलॉययट के साथ स्टोरीबोर्ड सबसे अच्छा विकल्प है। नीचे इसे प्राप्त करने के चरण दिए गए हैं

कदम

  1. यूआईलैब को व्यू कंट्रोलर में रखें और जहां चाहें वहां रखें। की संपत्ति के 0लिए भी रखा गया ।numberOfLinesUILabel

  2. इसे टॉप, लीडिंग और ट्रेलिंग स्पेस पिन कंस्ट्रक्शन दें।

यहाँ छवि विवरण दर्ज करें

  1. अब यह चेतावनी देगा, पीले तीर पर क्लिक करें।

यहाँ छवि विवरण दर्ज करें

  1. पर क्लिक करें Update Frameऔर पर क्लिक करें Fix Misplacement। यदि पाठ कम है और यदि पाठ अधिक है तो यह UILabel सिकुड़ जाएगा।

1
मैंने स्थानीयकरण के लिए परीक्षण नहीं किया है, लेकिन इसके लिए भी काम करना चाहिए।
योगेश सुथार

2
जब तक मैं "पसंदीदा चौड़ाई" "स्पष्ट" चेकबॉक्स को अनचेक नहीं करता, तब तक मैं किसी मौजूदा प्रोजेक्ट के साथ काम करने के लिए इसे प्राप्त नहीं कर सका, तब यह सब ठीक रहा।
zorro2b

25

यह उतना जटिल नहीं है जितना कि कुछ अन्य उत्तर इसे बनाते हैं।

यहाँ छवि विवरण दर्ज करें

बाएँ और शीर्ष किनारों को पिन करें

बस लेबल के बाईं और ऊपरी तरफ पिन करने के लिए बाधाओं को जोड़ने के लिए ऑटो लेआउट का उपयोग करें।

यहाँ छवि विवरण दर्ज करें

उसके बाद यह स्वचालित रूप से आकार बदल जाएगा।

टिप्पणियाँ

  • चौड़ाई और ऊंचाई के लिए बाधाओं को न जोड़ें। लेबल में उनकी पाठ्य सामग्री के आधार पर आंतरिक आकार होता है।
  • इसके साथ मदद के लिए इस जवाब के लिए धन्यवाद ।
  • sizeToFitऑटो लेआउट का उपयोग करते समय सेट करने की आवश्यकता नहीं है । उदाहरण परियोजना के लिए मेरा पूरा कोड यहाँ है:

    import UIKit
    class ViewController: UIViewController {
    
        @IBOutlet weak var myLabel: UILabel!
    
        @IBAction func changeTextButtonTapped(sender: UIButton) {
            myLabel.text = "my name is really long i want it to fit in this box"
        }
    }
  • यदि आप अपना लेबल लाइन रैप करना चाहते हैं तो आईबी में लाइनों की संख्या 0 पर सेट करें और myLabel.preferredMaxLayoutWidth = 150 // or whateverकोड जोड़ें । (मैंने अपने बटन को लेबल के निचले भाग पर भी पिन किया ताकि लेबल की ऊंचाई बढ़ने पर यह नीचे चला जाए।)

यहाँ छवि विवरण दर्ज करें

  • यदि आप गतिशील रूप से साइज़िंग लेबल की तलाश कर रहे हैं UITableViewCellतो इस उत्तर को देखें ।

यहाँ छवि विवरण दर्ज करें


नमस्ते, मुझे रिसाइज्ड लेबल मिला है, लेकिन मुझे समझ नहीं आ रहा है कि सेल ऊँचाई का आकार कैसे बदल सकता है। क्या आप कृपया मुझे बता सकते हैं कि सेल ऊँचाई का आकार कैसे बदल सकता है।
विवेक

@ विवेक, जब तक आपके पास ऊंचाई पर कोई बाधा नहीं है, इसे स्वचालित रूप से आकार बदलना चाहिए।
सुरगाछ

हां, लेकिन यह कैसे संभव है जब मैं कस्टम सेल का उपयोग करता हूं और मैंने उसके सेल में 2 लेबल लगाए।
विवेक

@ विवेक, क्षमा करें, मैंने आपके प्रश्न को गलत बताया है। क्या आपको पहले से ही इस जवाब से गुजरने के लिए एक लेबल मिला था ?
सूरगाछ 13


5

मैंने डैनियल के उत्तर के आधार पर कुछ तरीके बनाए।

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
    CGSize maximumLabelSize     = CGSizeMake(290, FLT_MAX);

    CGSize expectedLabelSize    = [text sizeWithFont:label.font
                                constrainedToSize:maximumLabelSize
                                    lineBreakMode:label.lineBreakMode];

    return expectedLabelSize.height;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label
{
    CGRect newFrame         = label.frame;
    newFrame.size.height    = [self heightForLabel:label withText:label.text];
    label.frame             = newFrame;
}

-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
    label.text              = text;
    [self resizeHeightToFitForLabel:label];
}

5

यहाँ मैं अपनी स्थिति के लिए काम कर रहा हूँ:

1) यूलैबेल की ऊंचाई में ऑटोलैयूट का उपयोग करके एक = = 0 बाधा है। चौड़ाई तय है। 2) टेक्स्ट को UILabel में असाइन करें, जिसमें पहले से ही उस बिंदु पर एक पर्यवेक्षक है (यह निश्चित नहीं है कि यह कितना महत्वपूर्ण है)। 3) फिर, करें:

    label.sizeToFit()
    label.layoutIfNeeded()

लेबल की ऊंचाई अब उचित रूप से सेट की गई है।


3
@implementation UILabel (UILabel_Auto)

- (void)adjustHeight {

    if (self.text == nil) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
        return;
    }

    CGSize aSize = self.bounds.size;
    CGSize tmpSize = CGRectInfinite.size;
    tmpSize.width = aSize.width;

    tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];

    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}

@end

यह श्रेणी विधि है। UILabel की ऊँचाई को समायोजित करने के लिए इस विधि को कॉल करने की तुलना में आपको पहले टेक्स्ट सेट करना होगा।


2

आप टेक्स्ट और अन्य संबंधित नियंत्रणों के अनुसार दो तरीकों से अपने लेबल को आकार दे सकते हैं-

  1. IOS 7.0 और इसके बाद के संस्करण के लिए

    CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : labelFont
                                                        }
                                              context:nil].size;

iOS 7.0 से पहले इसका उपयोग लेबल आकार की गणना करने के लिए किया जा सकता है

CGSize labelTextSize = [label.text sizeWithFont:label.font 
                            constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)  
                                lineBreakMode:NSLineBreakByWordWrapping];

// लेबलटेक्स्टहाइट के आधार पर अन्य नियंत्रणों को फिर से नाम दें

CGFloat labelTextHeight = labelTextSize.height;
  1. यदि आप लेबल के पाठ के आकार की गणना नहीं करना चाहते हैं तो आप इसका उपयोग कर सकते हैं -sizeToFit जैसे कि UILelli के उदाहरण पर-

    [label setNumberOfLines:0]; // for multiline label
    [label setText:@"label text to set"];
    [label sizeToFit];// call this to fit size of the label according to text

// इसके बाद आप अन्य संबंधित नियंत्रणों को वापस करने के लिए लेबल फ्रेम प्राप्त कर सकते हैं


2
  1. स्टोरीबोर्ड में लापता बाधाएं जोड़ें।
  2. स्टोरीबोर्ड में UILabel का चयन करें और 0 के लिए "लाइन" विशेषताएँ सेट करें।
  3. रेफरी आउटलेट यूआईबेल को कंट्रोलर के साथ आईडी: लेबल के साथ
  4. नियंत्रक [label sizeToFit];सुबह और देखने में जोड़ें

1

मुझे ऑटो लेआउट की बहुत बड़ी समस्या थी। हमारे पास टेबल सेल के अंदर दो कंटेनर हैं। आइटम विवरण (0 - 1000 चार्ट) के आधार पर दूसरे कंटेनर का आकार परिवर्तन किया जाता है, और पंक्ति को उनके आधार पर आकार दिया जाना चाहिए।

विवरण के लिए लापता घटक नीचे की बाधा थी।

मैंने गतिशील तत्व के निचले अवरोध को = 0 से > = 0 से बदल दिया है ।


इससे मेरी जान बच गई। यदि आप अनुसरण करने का प्रयास कर रहे हैं: github.com/honghaoz/… यह सही उत्तर है।
जस्टिन फ़्रील्स

0

हर बार फिट बैठता है! :)

    name.text = @"Hi this the text I want to fit to"
    UIFont * font = 14.0f;
    CGSize size = [name.text sizeWithAttributes:@{NSFontAttributeName: font}];
    nameOfAssessment.frame = CGRectMake(400, 0, size.width, 44);
    nameOfAssessment.font = [UIFont systemFontOfSize:font];

0

आप एक लाइन आउटपुट दिखा सकते हैं, फिर प्रॉपर्टी लाइन = 0 सेट कर सकते हैं और कई लाइन आउटपुट दिखा सकते हैं, फिर प्रॉपर्टी लाइन = 1 और अधिक सेट कर सकते हैं

[self.yourLableName sizeToFit];

-1

वहाँ भी इस दृष्टिकोण है:

[self.myLabel changeTextWithAutoHeight:self.myStringToAssignToLabel width:180.0f];

यह मैं नहीं था जिसने इस उत्तर को अस्वीकार कर दिया था लेकिन मैं सिर्फ यह बताना चाहता था कि मैं इस changeTextWithAutoHeight:width:पद्धति को नहीं देख सकता UILabel। क्या आप एक लिंक प्रदान कर सकते हैं जहां UIKit प्रलेखन में यह विधि मिल सकती है।
आदिल हुसैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.