टेक्स्ट को UILabel ऊँचाई समायोजित करें


112

मेरे पास कुछ लेबल हैं जो मैं उनकी ऊंचाई को पाठ में समायोजित करना चाहता हूं, यह कोड है जो मैंने अभी इसके लिए लिखा है

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

संपादित करें:

मुद्दा कोड के इस टुकड़े में नहीं था, इसलिए मेरा फिक्स सवाल में ही है। यह अभी भी दूसरों के लिए उपयोगी हो सकता है!


NSString UIKit परिवर्धन पर एक नज़र डालें, वहाँ आकार की गणना करने के लिए तरीके हैं जैसे कि आपको UILabel बनाए बिना ज़रूरत है।
व्लादिमीर ग्रिट्सेंको

@VladimirGritsenko स्विफ्ट में 'sizeWithFont' तरीके अनुपलब्ध हैं :(
TheBurgerShot

मैं मानता हूं कि मैं स्विफ्ट का विशेषज्ञ नहीं हूं, लेकिन मेरा मानना ​​है कि आप अपने खुद के तरीकों को जोड़ सकते हैं। आकार की गणना करने के लिए यूआईबेल बनाने पर अभी भी इसके लायक होगा।
व्लादिमीर ग्रिट्सेंको

@ TheBurgerShot sizeWithFontस्विफ्ट के लिए उपलब्ध नहीं हो सकता है Stringलेकिन यह NSStringआप पर उपलब्ध है फिर भी आपको उस पर कॉल करने में सक्षम होना चाहिए।
अनारकली

अंत में, त्रुटि कुछ अलग थी और इस पद्धति से कोई लेना-देना नहीं था। हालांकि यह अभी भी दूसरों के लिए मददगार हो सकता है।
TheBurgerShot

जवाबों:


189

मैंने इसे सिर्फ एक खेल के मैदान में रखा है और यह मेरे लिए काम करता है।

स्विफ्ट 4.0 के लिए अपडेट किया गया

import UIKit

 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

let font = UIFont(name: "Helvetica", size: 20.0)

var height = heightForView("This is just a load of text", font: font, width: 100.0)

स्विफ्ट 3:

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    return label.frame.height
}

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


यह खेल के मैदान में भी मी के लिए ठीक काम करता है, इस विशिष्ट स्थान पर त्रुटि उत्पन्न नहीं होती है, जब मैं इस पद्धति के उपयोग को हटाता हूं तो यह कुछ प्रिंटल के बारे में या केवल टिप्पणियों वाली एक पंक्ति के बारे में है, (तब यह कहता है EXC_B3_ACCESS कोड = 2 यथा)
TheBurgerShot

6
यह एक खेल के मैदान में काम करता है, लेकिन XCode 6.1 में एक दृश्य नियंत्रक के अंदर वांछित होने पर कोई आकार नहीं होता है
Unome

1
मैं एक नया UILabelआकार बनाने में थोड़ा संकोच कर रहा हूं ; यदि इस पद्धति का उपयोग layoutSubviewsपूर्ण लेआउट के अनुसार कई बार करने की प्रवृत्ति के साथ किया जाता है, तो अतिरिक्त ऑब्जेक्ट निर्माण विशेष रूप से स्क्रॉलिंग के दौरान ध्यान देने योग्य देरी का परिचय दे सकता है।
जोरावर

जाने textRect = textString.boundingRectWithSize (CGSizeMake (320, 2000), विकल्प: .UsesLineFragmentOrigin, गुण: textAttributes, संदर्भ: शून्य)
सिद्धार्थ पंचोली

मैं अपने व्यू कंट्रोलर में इस फ़ंक्शन को कॉल करने में असमर्थ हूं ... क्या आप मुझे सुझाव दे सकते हैं कि संभावित कारण क्या हो सकता है?
रौनी

64

यदि आप AutoLayout का उपयोग कर रहे हैं , तो आप UILabelकेवल UI की कॉन्फ़िगरेशन द्वारा ऊंचाई समायोजित कर सकते हैं ।

IOS8 या इसके बाद के संस्करण के लिए

  • अपने लिए बाधा / अग्रणी दिशा निर्धारित करें UILabel
  • और UILabel1 से 0 तक की पंक्तियों को बदलें

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

IOS7 के लिए

  • सबसे पहले , आप के लिए ऊंचाई शामिल करने की आवश्यकता हैUILabel
  • तो फिर , से संबंध को संशोधित Equalकरने के लिएGreater than or Equal

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

  • अंत में , UILabel1 से 0 तक की पंक्तियों को बदलें

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

आपका UILabelपाठ के आधार पर स्वचालित रूप से ऊंचाई बढ़ाएगा


2
और अगर लेबल एक सेल के अंदर है। आप अपने अनुसार सेल ऊंचाई कब और कैसे बढ़ाएंगे?
इलोजी

1
@oyalhi, यदि आपका लेबल एक टेबलव्यू सेल के अंदर है, तो कृपया मेरी अन्य पोस्ट stackoverflow.com/a/36277840/5381331 देखें
फान वन

3
यह पूरी तरह से मेरे लिए काम किया! बाधाओं को सेट करें, और यह ठीक से काम करेगा!
बिल थॉम्पसन

2
मेरे लिए काम नहीं कर रहा है ... शब्द "लेबल" एक UILabel में ऊंचाई = 20 बनाता है। यह सेटिंग के बाद 20 रहता है।
गैजेट 00

9

यदि आप चाहें तो मैं यह एक्सटेंशन बनाता हूं

extension UILabel {
    func setSizeFont (sizeFont: CGFloat) {
        self.font =  UIFont(name: self.font.fontName, size: sizeFont)!
        self.sizeToFit()
    }
}

8

मेरे पास काम करने का मजबूत उपाय है।

लेआउट में साक्षात्कार:

    _title.frame = CGRect(x: 0, y: 0, width: bounds.width, height: 0)
    _title.sizeToFit()
    _title.frame.size = _title.bounds.size

पाठ सेटर में:

    _title.text = newValue
    setNeedsLayout()

युपीडी। बेशक इस UILabel सेटिंग्स के साथ:

    _title.lineBreakMode = .ByWordWrapping
    _title.numberOfLines = 0

6

बस सेटिंग करके:

label.numberOfLines = 0

दर्ज किए गए पाठ की मात्रा के आधार पर लेबल स्वचालित रूप से अपनी ऊंचाई समायोजित करता है।


27
यह ऊँचाई को समायोजित करने के लिए यूआईबेल नहीं बनाता है।
TheBurgerShot

6

Anorak के जवाब के आधार पर, मैं Zorayr की चिंता से भी सहमत हूं, इसलिए मैंने UILabel को हटाने और केवल CGFloat को वापस करने के लिए कुछ पंक्तियाँ जोड़ीं, मुझे नहीं पता कि यह मूल कोड UIabel को जोड़ने में मदद करता है या नहीं, लेकिन यह त्रुटि नहीं फेंकता है, इसलिए मैं नीचे दिए गए कोड का उपयोग कर रहा हूं:

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{

    var currHeight:CGFloat!

    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    currHeight = label.frame.height
    label.removeFromSuperview()

    return currHeight
}

5

स्विफ्ट 4.1 और एक्सकोड 9.4.1 में

केवल 3 कदम

चरण 1)

//To calculate height for label based on text size and width
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat {
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

चरण 2)

//Call this function
let height = heightForView(text: "This is your text", font: UIFont.systemFont(ofSize: 17), width: 300)
print(height)//Output : 41.0

चरण 3)

//This is your label
let proNameLbl = UILabel(frame: CGRect(x: 0, y: 20, width: 300, height: height))
proNameLbl.text = "This is your text"
proNameLbl.font = UIFont.systemFont(ofSize: 17)
proNameLbl.numberOfLines = 0
proNameLbl.lineBreakMode = .byWordWrapping
infoView.addSubview(proNameLbl)

5

Uorabel के लिए एक विस्तार में गणना की संपत्ति के रूप में Anorak द्वारा सुझाया गया समाधान:

extension UILabel
{
var optimalHeight : CGFloat
    {
        get
        {
            let label = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.max))
            label.numberOfLines = 0
            label.lineBreakMode = self.lineBreakMode
            label.font = self.font
            label.text = self.text

            label.sizeToFit()

            return label.frame.height
         }
    }
}

उपयोग:

self.brandModelLabel.frame.size.height = self.brandModelLabel.optimalHeight

अच्छा समाधान! धन्यवाद :-)
क्रिस्टीना

प्रॉपर्टी को असाइन नहीं कर सकते: 'हाइट' एक गेट-ओनली प्रॉपर्टी है।
1891 में Amg91

4

@Anorak उत्तर पर अनुसरण करते हुए, मैंने स्ट्रिंग में यह एक्सटेंशन जोड़ा और एक पैरामीटर के रूप में एक इनसेट भेजा, क्योंकि कई बार आपको अपने पाठ के लिए एक पैडिंग की आवश्यकता होगी। वैसे भी, शायद कुछ आप इस उपयोगी मिल जाएगा।

extension String {

    func heightForWithFont(font: UIFont, width: CGFloat, insets: UIEdgeInsets) -> CGFloat {

        let label:UILabel = UILabel(frame: CGRectMake(0, 0, width + insets.left + insets.right, CGFloat.max))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.ByWordWrapping
        label.font = font
        label.text = self

        label.sizeToFit()
        return label.frame.height + insets.top + insets.bottom
    }
}

label.lineBreakMode = NSLineBreakMode.ByWordWrapping इस लाइन ने मुझे धन्यवाद देने में मदद की।
Coder_A_D

3

यहां स्विफ्ट में पाठ की ऊंचाई की गणना करने का तरीका बताया गया है। फिर आप आयत से ऊँचाई प्राप्त कर सकते हैं और लेबल या टेक्स्ट व्यू इत्यादि की कसौटी ऊँचाई सेट कर सकते हैं।

let font = UIFont(name: "HelveticaNeue", size: 25)!
let text = "This is some really long text just to test how it works for calculating heights in swift of string sizes. What if I add a couple lines of text?"

let textString = text as NSString

let textAttributes = [NSFontAttributeName: font]

let textRect = textString.boundingRectWithSize(CGSizeMake(320, 2000), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)

3

बस इस पद्धति को कॉल करें जहां आपको लेबल के लिए गतिशील ऊंचाई की आवश्यकता है

func getHeightforController(view: AnyObject) -> CGFloat {
    let tempView: UILabel = view as! UILabel
    var context: NSStringDrawingContext = NSStringDrawingContext()
    context.minimumScaleFactor = 0.8

    var width: CGFloat = tempView.frame.size.width

    width = ((UIScreen.mainScreen().bounds.width)/320)*width

    let size: CGSize = tempView.text!.boundingRectWithSize(CGSizeMake(width, 2000), options:NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: tempView.font], context: context).size as CGSize

    return size.height
}

3

स्विफ्ट 4.0

self.messageLabel = UILabel (फ्रेम: CGRect (x: 70, y: 60, चौड़ाई: UIScreen.main.bounds. उपलब्धता - 80, ऊंचाई: 30)

messageLabel.text = message

messageLabel.lineBreakMode = .byWordWrapping //in versions below swift 3 (messageLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping)    
messageLabel.numberOfLines = 0 //To write any number of lines within a label scope

messageLabel.textAlignment = .center

messageLabel.textColor = UIColor.white

messageLabel.font = messageLabel.font.withSize(12)

messageLabel.sizeToFit()

NSParagraphStyle.LineBreakMode को ब्लॉक करें, पूरे अनुच्छेदों पर लागू करें, अनुच्छेदों के भीतर नहीं। यह गुण सामान्य आरेखण के दौरान और उन मामलों में जहां फ़ॉन्ट आकार को इसके बाउंडिंग बॉक्स में लेबल के पाठ को फिट करने के लिए कम होना चाहिए। यह गुण डिफ़ॉल्ट रूप से byTruncatingTail पर सेट है।

यह लिंक स्टोरीबोर्ड के समान तरीके का वर्णन करता है


2
कोड-ओनली उत्तरों को अच्छा अभ्यास नहीं माना जाता है। कृपया इस बारे में कुछ स्पष्टीकरण जोड़ने पर विचार करें कि आपका उत्तर प्रश्न को कैसे संबोधित करता है।
यनीस

2

स्विफ्ट 4.0

पाठ / लेबल की ऊँचाई की गणना करने के बजाय, मैं केवल (डायनामिक) पाठ डालने के बाद लेबल का आकार बदल देता हूँ।

यह मानते हुए कि myLabel सवाल में UILabel है:

let myLabel = UILabel(frame: CGRect(x: 0, y: 0, width: *somewidth*, height: *placeholder, e.g. 20*))
myLabel.numberOfLines = 0
myLabel.lineBreakMode = .byWordWrapping
...

और अब आता है मजेदार हिस्सा:

var myLabelText: String = "" {
   didSet {
      myLabel.text = myLabelText
      myLabel.sizeToFit()
   }
}

2

स्विफ्ट 4.1 calculate लेबल ऊंचाई तक विस्तार विधि:

extension UILabel {

    func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat {
        let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.byWordWrapping
        label.font = font
        label.text = text

        label.sizeToFit()
        return label.frame.height
    }

}

1

स्विफ्ट 5, एक्सकोड 11 स्टोरीबोर्ड रास्ता। मुझे लगता है कि यह iOS 9 और उच्चतर के लिए काम करता है। आप गतिशील ऊंचाई पाने के लिए उदाहरण के लिए "विवरण" लेबल चाहते हैं, चरणों का पालन करें:

1) वर्णन लेबल चुनें -> गुण निरीक्षक (पेंसिल आइकन) पर जाएं, सेट करें: लाइन्स: 0 लाइन ब्रेक: वर्ड रैप

2) स्टोरीबोर्ड से अपने UILabel का चयन करें और आकार निरीक्षक (शासक आइकन) पर जाएं, 3) "अन्य सभी UIView (लैब्स, बटन, इमेजव्यू, आदि) घटकों के लिए" सामग्री संपीड़न प्रतिरोध प्राथमिकता प्राथमिकता 1 पर जाएं जो आपके लेबल के साथ इंटरैक्ट कर रहे हैं।

उदाहरण के लिए, मेरे पास UIImageView, शीर्षक लेबल और वर्णन लेबल मेरे विचार में लंबवत हैं। मैंने UIImageView के लिए सामग्री संपीड़न प्रतिरोध प्राथमिकता को 1 पर और शीर्षक लेबल को 750 पर और विवरण लेबल के लिए 750 पर सेट किया है। यह एक विवरण लेबल को उतनी ही ऊंचाई पर ले जाएगा।


0

स्विफ्ट में लेबल को डायनामिक बनाने के लिए, ऊँचाई में बाधा न डालें और स्टोरीबोर्ड में लेबल नंबर की पंक्तियाँ बनाएँ 0 भी नीचे की ओर अवरोध प्रदान करते हैं और यह सबसे अच्छा तरीका है कि मैं डायनामिक लेबल को उनके सामग्री आकार के अनुसार संभाल रहा हूँ।


0

आप sizeThatFitsफ़ंक्शन का उपयोग भी कर सकते हैं ।

उदाहरण के लिए:

label.sizeThatFits(superView.frame.size).height

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