UILabel में लाइन रिक्ति को कैसे नियंत्रित करें


273

क्या पाठ के बीच के अंतर को कम करना संभव है, जब एक में कई लाइनों में रखा जाता है UILabel? हम फ्रेम, फ़ॉन्ट आकार और लाइनों की संख्या निर्धारित कर सकते हैं। मैं उस लेबल में दो लाइनों के बीच के अंतर को कम करना चाहता हूं।



2
क्या मेरा सुझाव है कि आप उन उत्तरों में से एक को स्वीकार करते हैं जो iOS 6.0 और बाद के लिए सही है? वर्तमान में स्वीकृत उत्तर पुराना है।
मार्क अमेरी

प्रत्येक पंक्ति के लिए एक नए का उपयोग करें UILabel, फिर सभी लेबल को एक में एम्बेड करें StackView। अंत में समायोजित spacingकी StackView। उन्हें खड़ी करने के लिए याद रखें।
Honey

स्विफ्ट 2 में समाधान के लिए निम्न लिंक देखें। stackoverflow.com/a/39158698/6602495
स्नेहा

स्टोरीबोर्ड ट्वीक और अन्य विवरणों के लिए stackoverflow.com/a/44325650/342794 का संदर्भ लें ।
लाल

जवाबों:


261

मैंने इस उत्तर में कुछ नया जोड़ने के बारे में सोचा, इसलिए मुझे उतना बुरा नहीं लगता ... यहाँ एक स्विफ्ट उत्तर है:

import Cocoa

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 40

let attrString = NSMutableAttributedString(string: "Swift Answer")
attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

var tableViewCell = NSTableCellView()
tableViewCell.textField.attributedStringValue = attrString

"संक्षिप्त उत्तर: आप नहीं कर सकते हैं। पाठ की पंक्तियों के बीच अंतर को बदलने के लिए, आपको UILabel को उप-वर्ग करना होगा और अपना स्वयं का ड्राटैक्स इन रेक्ट रोल करना होगा, या कई लेबल बनाने होंगे।"

देखें: UILabel लाइन रिक्ति सेट करें


यह वास्तव में पुराना उत्तर है, और अन्य ने पहले से ही इसे संभालने के लिए नए और बेहतर तरीके से जोड़ दिया है .. कृपया नीचे दिए गए उत्तर के उत्तर देखें।


23
IOS 6.0 के बाद से, आप इसे NSAttributedString(Xcode के इंटरफ़ेस बिल्डर में UILable के गुणों में भी उपलब्ध) के माध्यम से नियंत्रित कर सकते हैं ।
21

13
दिलचस्प है, जैसा कि मैं बता सकता हूं, आप लाइनों के बीच अतिरिक्त रिक्ति जोड़ सकते हैं, लेकिन ए NSParagraphStyleका उपयोग करते समय इसे कम न करें NSAttributedString। (मुझे अन्य संशोधित गुणों का अधिक परीक्षण करने की आवश्यकता हो सकती है, लेकिन lineSpacingसंपत्ति केवल आपको इसे बढ़ाने की अनुमति देती है।)
लिविंगटेक

देख मेरा उत्तर एक तरह से NSAttributedString का उपयोग कर देखने के लिए
d.ennis

2
@livingtech जो कि बहुत बुरा है, और मेरा मानना ​​है कि आप सही हैं। क्या आपको कोई वर्कअराउंड मिला है?
डोम विनयार्ड

7
बस इस धागे में कुछ स्पष्ट करने के लिए। यदि आप लाइन रिक्ति को 1.0 तक सेट करना चाहते हैं, तो लाइन को सिकोड़ें और फिर सेटलाइनहाइट मल्च्युलेट को कम मान <1.0 पर सेट करें, जैसे: [पैराग्राफल सेटलाइनहाइट म्यूटेल्टर: 0.8] या पैराग्राफल.लाइनहाइट
मल्च्युटर

401

Xcode 6 में आप स्टोरीबोर्ड में ऐसा कर सकते हैं:

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


1
स्टोरीबोर्ड के अधिक लाभ उठाएं!
एलन

22
@PaperThick का 6.1.1 में एक ही अंक है। यह कुछ मिनटों के लिए "हार्लेम शेक" है। इसे ठीक करने का तरीका पता नहीं है :) Xcode मिलाते हुए
Anton Gaenko

8
क्या इस तरह से कस्टम फोंट सेट करने का एक तरीका है? मुझे लगता है कि हेल्वेटिका नेउ को किसी अन्य फ़ॉन्ट में बदलने के लिए प्रतीत नहीं हो सकता।
मार्कोस कर्वेलो

2
यदि आप 'एट्रिब्यूटेड' को सक्षम करते हैं, और फिर फाइल को सोर्स कोड के रूप में खोलते हैं, तो आप 'लाइनहाइट मेल्टू' को मैन्युअल रूप से एडिट कर सकते हैं, और इसलिए हार्लेम शेक बग को बाईपास करें
ED-209

2
@azdev किसी को भी यह देख के लिए, मैं अब Xcode 7.3 में हिला रहा हूँ, लेकिन मुझे लगता है कि यह पहला संस्करण है जहाँ यह एक समस्या नहीं है
LulzCow

103

IOS 6 से शुरू होकर आप UILabel के लिए एक जिम्मेदार स्ट्रिंग सेट कर सकते हैं। निम्नलिखित जांचें:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)];

label.attributedText = attributedString;

1
एक attributedStringहोना चाहिए NSMutableAttributedString(NSAttributedString नहीं)
माइक एस

14
पहली पंक्ति का कोड होना चाहिएNSMutableAttributedString *attributedString = [NSMutableAttributedString alloc]initWithString:@"sample text"];
एलन

की lineSpacingसंपत्ति NSMutableParagraphStyleकभी भी नकारात्मक नहीं होती है, इसलिए इस दृष्टिकोण के साथ लाइन की ऊंचाई कम नहीं की जा सकती है। प्रश्न का उत्तर देने के लिए, आपको एक और संपत्ति का उपयोग करना होगा, @ d.ennis उत्तर देखें।
थियो

81

यहां बताए गए समाधान मेरे लिए कारगर नहीं थे। मुझे iOS 6 NSAttributeString के साथ इसे करने का थोड़ा अलग तरीका मिला:

myLabel.numberOfLines = 0; 
NSString* string = @"String with line one. \n Line two. \n Line three.";
NSMutableParagraphStyle *style  = [[NSMutableParagraphStyle alloc] init];
style.minimumLineHeight = 30.f;
style.maximumLineHeight = 30.f;
NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:string
                                                         attributes:attributtes];   
[myLabel sizeToFit];

1
लाइन की ऊंचाई फ़ॉन्ट आकार पर निर्भर है। लाइन रिक्ति सिर्फ इतना है कि, लाइन रिक्ति। आपको न्यूनतम / अधिकतम लाइन ऊंचाई सेट करके काम करने की चीजें मिल सकती हैं, लेकिन यह केवल इसलिए है क्योंकि आपके द्वारा उपयोग किए जा रहे वर्तमान फ़ॉन्ट आकार लाइन की ऊंचाई सीमाओं से अधिक नहीं हैं। प्रलेखन के अनुसार: "... इस ऊंचाई से अधिक ग्लिफ़ और ग्राफिक्स पड़ोसी लाइनों को ओवरलैप करेंगे ... हालांकि यह सीमा रेखा पर ही लागू होती है, लाइन रिक्ति आसन्न लाइनों के बीच अतिरिक्त स्थान जोड़ती है।"
एर ब्रिगिंस्की

+1, यदि आप लाइनों के बीच अंतर कम करना चाहते हैं, तो यही आप करना चाहते हैं। वास्तविक लाइन रिक्ति सबसे अधिक संभावना है 0 डिफ़ॉल्ट रूप से, यही कारण है कि लोग रिपोर्ट करते हैं कि आप केवल इसे बढ़ा सकते हैं। स्पेस स्पेस बहुत बड़ा होने की समस्या लाइन की ऊँचाई से बहुत बड़ी होने के कारण आती है, यही कारण है कि इससे 99% काम समय पर हो जाएगा।
लॉरिको

1
यह एकमात्र ऐसा उत्तर है जो मुझे मिल सकता है कि फ़ोटोशॉप, स्केच, सीएसएस, आदि जैसे अनुप्रयोगों को डिज़ाइन करने के लिए वास्तविक लाइन ऊंचाई मान (एक अनुपात के बजाय) का उपयोग करता है
अल्बर्ट बोरी

35

मैंने यह सरल विस्तार किया है जो मेरे लिए बहुत अच्छा काम करता है:

extension UILabel {
    func setLineHeight(lineHeight: CGFloat) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = lineHeight
        paragraphStyle.alignment = self.textAlignment

        let attrString = NSMutableAttributedString()
        if (self.attributedText != nil) {
            attrString.append( self.attributedText!)
        } else {
            attrString.append( NSMutableAttributedString(string: self.text!))
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
        }
        attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}

इसे किसी फ़ाइल में कॉपी करें, ताकि आप इसे इस तरह से उपयोग कर सकें

myLabel.setLineHeight(0.7)

याद रखें कि यदि आप इस लेबल के लिए स्टोरीबोर्ड का उपयोग कर रहे हैं, तो आप अपने लेबल की पंक्तियों को 0 पर सेट करना सुनिश्चित करें
Honey

आप सीधे सेट क्यों नहीं करते हैं lineSpacingऔर सेटिंग के बारे में भूल जाते हैं lineHeightMultiple?
हनी

क्योंकि लाइन की ऊँचाई को कम करने की कुंजी 'लाइनहाइट मल्च्युअल्ट' है, कोई लाइनस्प्रेसिंग नहीं
अगस्टिन मर्ल्स

कहते हैं कि आप चाहते हैं कि आपकी लाइन की ऊँचाई 1.4 हो, आप बस इतना क्यों नहीं लिख सकते .lineSpacing = 1.4और सब भूल सकते हैं .lineHeightMultiple...
हनी

हा! मैंने कोशिश की, और मैंने काम नहीं किया, लेकिन मुझे आश्चर्य है कि मुझे आपके तंत्र का उपयोग न करते हुए अन्य उत्तर क्यों दिखाई नहीं दे रहे हैं, मेरा मतलब है कि वे सीधे लाइनऑर्डर को सेट करते हैं। स्वीकृत उत्तर देखें ...
हनी

33

इंटरफ़ेस बिल्डर (स्टोरीबोर्ड / XIB) से:

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

प्रोग्राम के रूप में:

स्विफ्ट 4

लेबल एक्सटेंशन का उपयोग करना

extension UILabel {

    // Pass value for any one of both parameters and see result
    func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {

        guard let labelText = self.text else { return }

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple

        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }

        // Line spacing attribute
        attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

        self.attributedText = attributedString
    }
}

अब कॉल एक्सटेंशन फ़ंक्शन

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"

// Pass value for any one argument - lineSpacing or lineHeightMultiple
label.setLineSpacing(lineSpacing: 2.0) .  // try values 1.0 to 5.0

// or try lineHeightMultiple
//label.setLineSpacing(lineHeightMultiple = 2.0) // try values 0.5 to 2.0

या लेबल उदाहरण का उपयोग कर (परिणाम देखने के लिए इस कोड को कॉपी और निष्पादित करें)

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40

// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))

// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))

label.attributedText = attrString

स्विफ्ट 3

let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString

2
मूल संरेखण रखने के लिए लाइन "पैराग्राफ़ी.लिग्नमेंट = सेल्फटेक्लिनेमेंट" जोड़ें। अन्यथा, पाठ को संरेखित किया जाएगा।
नितिन माइकल

बड़े ग्रंथों पर अंडाकार खो किसी के लिए है, तो का उपयोग करें: paragraphStyle.lineBreakMode = .byTruncatingTail
christostsang

19

IOS 6 में अब एक वैकल्पिक उत्तर है, जो उचित पैरा शैलियों के साथ NSAttributedString का उपयोग करके लेबल पर एट्रिब्यूटेड टेक्स्ट सेट करना है। NSAttributedString के साथ लाइन ऊंचाई के विवरण के लिए यह स्टैक ओवरफ्लो उत्तर देखें:

कोर पाठ - NSAttributedString लाइन ऊंचाई सही किया?


16

यहाँ एक वर्ग है कि उप-संपत्ति की संपत्ति के लिए UILabel उपवर्ग: https://github.com/LemonCake/MSLabel


यह मेरे लिए काम किया, धन्यवाद। मैंने MTLabel का उपयोग करने की भी कोशिश की, लेकिन यह बेहतर था।
डेनिस कुतलुबाएव

1
किसी को पता है कि क्या MSLabel '\ n' वर्ण का समर्थन करता है?
achi

11

स्विफ्ट और एक फ़ंक्शन के रूप में, डार्कडस्ट से प्रेरित है

// Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20)
func setTextWithLineSpacing(label:UILabel,text:String,lineSpacing:CGFloat)
{
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = lineSpacing

    let attrString = NSMutableAttributedString(string: text)
    attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

    label.attributedText = attrString
}

7

@Mike के उत्तर के अनुसार, lineHeightMultipleकुंजी बिंदु को कम करना है। नीचे उदाहरण, यह मेरे लिए अच्छी तरह से काम करता है:

    NSString* text = label.text;
    CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: label.font}].width;
    if (textWidth > label.frame.size.width) {
        NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
        paragraph.alignment = NSTextAlignmentCenter;
        paragraph.lineSpacing = 1.0f;
        paragraph.lineHeightMultiple = 0.75;     // Reduce this value !!!
        NSMutableAttributedString* attrText = [[NSMutableAttributedString alloc] initWithString:text];
        [attrText addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, text.length)];
        label.attributedText = attrText;
    }

6

स्विफ्ट 3 अधिक आसानी से लाइनों के बीच सेट स्थान के लिए उपयोगी विस्तार :)

extension UILabel
{
    func setLineHeight(lineHeight: CGFloat)
    {
        let text = self.text
        if let text = text 
        {

            let attributeString = NSMutableAttributedString(string: text)
            let style = NSMutableParagraphStyle()

           style.lineSpacing = lineHeight
           attributeString.addAttribute(NSParagraphStyleAttributeName,
                                        value: style,
                                        range: NSMakeRange(0, text.characters.count))

           self.attributedText = attributeString
        }
    }
}

5

मुझे एक ऐसा रास्ता मिला है जहाँ आप वास्तविक लाइन ऊँचाई (कारक नहीं) सेट कर सकते हैं और यह इंटरफ़ेस बिल्डर में लाइव भी प्रस्तुत करता है । बस नीचे दिए गए निर्देशों का पालन करें। कोड स्विफ्ट 4 में लिखा गया है ।


चरण # 1: नामक एक फ़ाइल बनाएं DesignableLabel.swiftऔर निम्नलिखित कोड डालें:

import UIKit

@IBDesignable
class DesignableLabel: UILabel {
    @IBInspectable var lineHeight: CGFloat = 20 {
        didSet {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.minimumLineHeight = lineHeight
            paragraphStyle.maximumLineHeight = lineHeight
            paragraphStyle.alignment = self.textAlignment

            let attrString = NSMutableAttributedString(string: text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: font, range: NSRange(location: 0, length: attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrString.length))
            attributedText = attrString
        }
    }
}

चरण # 2:UILabel एक स्टोरीबोर्ड / एक्सआईबी में रखें और इसके वर्ग को सेट करें DesignableLabel। अपनी परियोजना के निर्माण के लिए प्रतीक्षा करें (निर्माण सफल होना चाहिए!)।

अपने UILabel को कक्षा निर्दिष्ट करना


चरण 3: अब आपको "लाइन ऊंचाई" नाम के गुण फलक में एक नई संपत्ति देखनी चाहिए। बस आपको जो मूल्य पसंद है उसे सेट करें और आपको तुरंत परिणाम देखना चाहिए !

गुणों में लाइन ऊँचाई सेट करें


2

यहाँ UILabel का एक उपवर्ग है जो सेट करता है lineHeightMultipleऔर सुनिश्चित करता है कि आंतरिक ऊंचाई पाठ को न काटने के लिए पर्याप्त है।

@IBDesignable
class Label: UILabel {
    override var intrinsicContentSize: CGSize {
        var size = super.intrinsicContentSize
        let padding = (1.0 - lineHeightMultiple) * font.pointSize
        size.height += padding
        return size
    }

    override var text: String? {
        didSet {
            updateAttributedText()
        }
    }

    @IBInspectable var lineHeightMultiple: CGFloat = 1.0 {
        didSet {
            updateAttributedText()
        }
    }

    private func updateAttributedText() {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiple
        attributedText = NSAttributedString(string: text ?? "", attributes: [
            .font: font,
            .paragraphStyle: paragraphStyle,
            .foregroundColor: textColor
        ])
        invalidateIntrinsicContentSize()
    }
}

अतिरिक्त पैडिंग होना चाहिए (लाइनहाइट -मूल्ट - 1.0) * font.pointSize, है ना?
पावेल एलेक्सीव

जैसा कि ऊपर-ऊपर कोड मेरे लिए काम कर रहा है। लेकिन शायद आप सही हैं। क्या आपने अपने बदलाव की कोशिश की? @PavelAlexeev
फातमान

नहीं, मैं लाइनहाइट के बजाय लाइनस्पेट के साथ रहना चाहता हूं :)
पावेल

1

स्विफ्ट 2.0 में ...

एक्सटेंशन जोड़ें:

extension UIView {
    func attributesWithLineHeight(font: String, color: UIColor, fontSize: CGFloat, kern: Double, lineHeightMultiple: CGFloat) -> [String: NSObject] {
        let titleParagraphStyle = NSMutableParagraphStyle()
        titleParagraphStyle.lineHeightMultiple = lineHeightMultiple

        let attribute = [
            NSForegroundColorAttributeName: color,
            NSKernAttributeName: kern,
            NSFontAttributeName : UIFont(name: font, size: fontSize)!,
            NSParagraphStyleAttributeName: titleParagraphStyle
        ]
        return attribute
    }
}

अब, अपने यूआईलैब को एट्रिब्यूट के रूप में सेट करें:

self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5))    

जाहिर है, मैंने उन मापदंडों का एक समूह जोड़ा है जिनकी आपको आवश्यकता नहीं हो सकती है। चारों ओर खेलें - विधि को फिर से लिखने के लिए स्वतंत्र महसूस करें - मैं इसके लिए अलग-अलग उत्तरों का एक गुच्छा देख रहा था ताकि मुझे लगा कि अगर इसमें कोई मदद करता है तो मैं इसका पूरा विस्तार पोस्ट करूँगा ... -rab


1

Swift3 - एक UITextView या UILabel एक्सटेंशन में, इस फ़ंक्शन को जोड़ें:

यदि आप पहले से ही दृश्य के साथ जिम्मेदार तार का उपयोग कर रहे हैं (उन्हें अधिलेखित करने के बजाय), तो मैंने कुछ कोड को वर्तमान के जिम्मेदार पाठ को रखने के लिए जोड़ा।

func setLineHeight(_ lineHeight: CGFloat) {
    guard let text = self.text, let font = self.font else { return }

    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = 1.0
    paragraphStyle.lineHeightMultiple = lineHeight
    paragraphStyle.alignment = self.textAlignment

    var attrString:NSMutableAttributedString
    if let attributed = self.attributedText {
        attrString = NSMutableAttributedString(attributedString: attributed)
    } else {
        attrString = NSMutableAttributedString(string: text)
        attrString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, attrString.length))
    }
    attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
    self.attributedText = attrString
}

1

एक अन्य उत्तर ... यदि आप स्ट्रिंग को प्रोग्रामिक रूप से पास कर रहे हैं, तो आपको एक नियमित स्ट्रिंग के बजाय एक जिम्मेदार स्ट्रिंग को पास करने और इसे शैली बदलने की आवश्यकता है। (iOS8)

NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
                   value:style
                   range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;

1

स्विफ्ट 3 एक्सटेंशन:

    import UIKit

extension UILabel {
    func setTextWithLineSpacing(text: String, lineHeightMultiply: CGFloat = 1.3) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineHeightMultiple = lineHeightMultiply
        paragraphStyle.alignment = .center
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
        self.attributedText = attributedString
    }
}

1

इसके साथ मदद करनी चाहिए। फिर आप स्टोरीबोर्ड के भीतर इस कस्टम वर्ग को अपना लेबल असाइन कर सकते हैं और गुणों के भीतर सीधे इसका उपयोग कर सकते हैं:

open class SpacingLabel : UILabel {

    @IBInspectable open var lineHeight:CGFloat = 1 {
        didSet {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = 1.0
            paragraphStyle.lineHeightMultiple = self.lineHeight
            paragraphStyle.alignment = self.textAlignment

            let attrString = NSMutableAttributedString(string: self.text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
            self.attributedText = attrString
        }
    } 
}

इसके साथ मदद करनी चाहिए। फिर आप स्टोरीबोर्ड के भीतर इस कस्टम वर्ग को अपना लेबल असाइन कर सकते हैं और गुणों के भीतर इसका सीधे मापदंडों का उपयोग कर सकते हैं।
रसेल वारविक

कृपया टिप्पणियों में अपने उत्तर से संबंधित सामग्री न डालें। आपके उत्तर को टिप्पणियों के माध्यम से पढ़ने के लिए बिना उपयोगी होना चाहिए
न्यूरॉन

1

स्विफ्ट 4 लेबल एक्सटेंशन। NSMutableAttributedString को फ़ंक्शन में पास करने से पहले बनाना, अतिरिक्त पाठ के लिए आवश्यक विशेषताएँ हैं।

extension UILabel {

    func setLineHeightMultiple(to height: CGFloat, withAttributedText attributedText: NSMutableAttributedString) {

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = height
        paragraphStyle.alignment = textAlignment

        attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedText.length - 1))

        self.attributedText = attributedText
    }
}

0

इस कोड ने मेरे लिए काम किया (ios 7 & ios 8 for sure)।

_label.numberOfLines=2;
_label.textColor=[UIColor whiteColor];

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple=0.5;
paragraphStyle.alignment = NSTextAlignmentCenter;
paragraphStyle.lineSpacing = 1.0;

NSDictionary *nameAttributes=@{
                               NSParagraphStyleAttributeName : paragraphStyle,
                               NSBaselineOffsetAttributeName:@2.0
                               };


NSAttributedString *string=[[NSAttributedString alloc] initWithString:@"22m\nago" attributes:nameAttributes];
_label.attributedText=string;

0

यहाँ स्विफ्ट में मेरा समाधान है। उपवर्ग को एसेटेड टेक्स्ट और टेक्स्ट प्रॉपर्टी और कैरेक्टरस्पेसिंग + लाइनस्पेसिंग दोनों के लिए काम करना चाहिए। यदि नया स्ट्रिंग या एट्रिब्यूटेड स्ट्रिंग सेट है, तो यह रिक्ति को बरकरार रखता है।

open class UHBCustomLabel : UILabel {
    @IBInspectable open var characterSpacing:CGFloat = 1 {
        didSet {
            updateWithSpacing()
        }

    }
    @IBInspectable open var lines_spacing:CGFloat = -1 {
        didSet {
            updateWithSpacing()
        }

    }
    open override var text: String? {
        set {
            super.text = newValue
            updateWithSpacing()
        }
        get {
            return super.text
        }
    }
    open override var attributedText: NSAttributedString? {
        set {
            super.attributedText = newValue
            updateWithSpacing() 
        }
        get {
            return super.attributedText
        }
    }
    func updateWithSpacing() {
        let attributedString = self.attributedText == nil ? NSMutableAttributedString(string: self.text ?? "") : NSMutableAttributedString(attributedString: attributedText!)
        attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
        if lines_spacing >= 0 {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = lines_spacing
            paragraphStyle.alignment = textAlignment
            attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        }
        super.attributedText = attributedString
    }
}

-5

त्वरित-गंदे-स्मार्ट-सरल समाधान के रूप में:

UILabels के लिए, जिसके पास बहुत अधिक लाइनें नहीं हैं, आप इसके बजाय stackViews का उपयोग कर सकते हैं।

  1. प्रत्येक पंक्ति के लिए एक नया लेबल लिखें।
  2. उन्हें एक StackView में एम्बेड करें। (दोनों लेबल चुनें -> संपादक -> एम्बेड करें -> StackView
  3. SpacingStackView को अपनी इच्छित राशि में समायोजित करें

उन्हें खड़ी करने के लिए सुनिश्चित करें । यह समाधान कस्टम फोंट के लिए भी काम करता है।

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


FWIW यह एक भयानक अभी तक व्यावहारिक समाधान है। इसलिए मैं इसे रख रहा हूं।
हनी

मैंने ग्राफ़ बनाने के लिए एक सिद्धांत iOS देव उपयोग स्टैकव्यू भी देखा है। साक्षात्कार बहुत शक्तिशाली हैं
हनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.