วิธีเพิ่มระยะห่างระหว่างบรรทัดใน UILabel ใน Swift


94

ฉันมีป้ายกำกับที่มีข้อความไม่กี่บรรทัดและฉันต้องการเพิ่มระยะห่างระหว่างบรรทัด มีคำถามคล้าย ๆ กันที่คนอื่นถาม แต่วิธีแก้ปัญหาไม่ช่วยแก้ปัญหา นอกจากนี้ฉลากของฉันอาจมีหรือไม่มีย่อหน้าก็ได้ ฉันยังใหม่กับSwift. มีวิธีแก้ปัญหาโดยใช้สตอรี่บอร์ดหรือไม่? หรือผ่านNSAttributedStringไปได้เท่านั้น?

คำตอบ:


175

เพิ่ม LineSpacing UILabelโดยทางโปรแกรมโดยใช้ข้อมูลโค้ดต่อไปนี้

Swift เวอร์ชันก่อนหน้า

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

Swift 4.0

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

สวิฟต์ 4.2

let attributedString = NSMutableAttributedString(string: "Your text")

// *** Create instance of `NSMutableParagraphStyle`
let paragraphStyle = NSMutableParagraphStyle()

// *** set LineSpacing property in points ***
paragraphStyle.lineSpacing = 2 // Whatever line spacing you want in points

// *** Apply attribute to string ***
attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))

// *** Set Attributed String to your label ***
label.attributedText = attributedString

3
สิ่งนี้แสดงข้อผิดพลาด "Value of type" NSAttributedString "has no member" addAttribute ""
Sneha

2
เราจำเป็นต้องใช้แทนNSMutableAttributedString NSAttributedStringฉันได้อัปเดต asnwer
Dipen Panchasara

1
ทำงานกับแบบอักษรที่กำหนดเองได้ดีเช่นกัน @ Dipen Panchasara
Abdul Karim

7
ฉันไม่รู้ว่าทำไม แต่สำหรับฉันมันใช้ได้เฉพาะเมื่อคุณตั้งค่าการเว้นบรรทัด> = 1 ฉันพยายามตั้งค่า 0.5 / 0.75 มันไม่มีผลใด ๆ
Aximem

2
ไม่จำเป็นต้องNSMutableAttributedString. สามารถใช้NSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic

101

จาก Interface Builder:

ป้อนคำอธิบายภาพที่นี่

โดยทางโปรแกรม:

SWift 4 และ 4.2

ใช้นามสกุลฉลาก

extension UILabel {

    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)
        }

        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))


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

        self.attributedText = attributedString
    }
}

ตอนนี้เรียกฟังก์ชันส่วนขยาย

let label = UILabel()
let stringValue = "Set\nUILabel\nline\nspacing"

// 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 = "Set\nUILabel\nline\nspacing"
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 = "Set\nUILabel\nline\nspacing"
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

"NSAttributedStringKey.paragraphStyle" มีข้อผิดพลาดฉันใช้ "NSParagraphStyleAttributeName" แทน
Ahmadreza

@Alfi - ความแตกต่างของเวอร์ชันภาษา Swift ภาษาที่รวดเร็วของโครงการของคุณ เวอร์ชันอาจเป็น 3.x ที่รวดเร็วและนี่คือคำตอบสำหรับทั้งสองเวอร์ชัน ลองใช้รหัส Swift 3
Krunal

สวัสดี @krunal ฉันได้ตั้งค่า Linespacing และ LineHeight ในอินเทอร์เฟซและฉันตั้งค่าข้อความใน UILabel แบบเป็นโปรแกรม แต่ไม่ทำงาน ถ้าฉันเพิ่มข้อความในอินเทอร์เฟซมันก็ใช้ได้ คุณช่วยฉันได้ไหมสำหรับคำขอบคุณนี้และฉันยังตั้งค่า attributedText และข้อความใน UILabel แต่วิธีนั้นใช้ไม่ได้กับฉัน
Yogesh Patel

โซลูชันตัวสร้างอินเทอร์เฟซใช้สำหรับข้อความคงที่เท่านั้น เมื่อเราเพิ่มสตริงแอตทริบิวต์ในโค้ดแอตทริบิวต์ที่เพิ่มจากตัวสร้างอินเทอร์เฟซจะไม่ถูกนำไปใช้
Yodagama

66

storyboardคุณสามารถควบคุมระยะห่างระหว่างบรรทัดใน

ป้อนคำอธิบายภาพที่นี่

คำถามเดียวกัน.


8
ฉันได้ลองสิ่งนี้จริง แต่มันไม่ทำงาน นอกจากนี้ยังไม่มีประโยชน์สำหรับฟอนต์ที่กำหนดเอง
Sneha

หากคุณกำลังประสบผิดพลาดการจัดตำแหน่งในแบบอักษรที่กำหนดเองพยายามที่จะปรับปรุงascenderสถานที่ให้บริการเป็นที่กล่าวถึงนี่
pkc456

1
ไม่ใช่ปัญหาการจัดตำแหน่งที่ผิด ฉันไม่สามารถเลือกแบบอักษรที่กำหนดเองด้วยวิธีการแก้ปัญหาที่คุณกล่าวไว้ @ pkc456
Sneha

ไม่ใช่ปัญหาการจัดตำแหน่งที่ผิด ฉันไม่สามารถเลือกแบบอักษรที่กำหนดเองได้ แต่ตอนนี้ฉันแก้ไขแล้วโดยการเพิ่มแบบอักษรของฉันผ่านการตั้งค่าแยกกันใน Attributed แต่ยังคงเว้นระยะห่างเหมือนเดิม @ pkc456
Sneha

15
ใช้สำหรับข้อความคงที่เท่านั้น ลองเพิ่มโปรแกรมข้อความ วิธีนี้ใช้ไม่ได้
Sneha

11

โซลูชันล่าสุดสำหรับ Swift 5.0

private extension UILabel {

    // MARK: - spacingValue is spacing that you need
    func addInterlineSpacing(spacingValue: CGFloat = 2) {

        // MARK: - Check if there's any text
        guard let textString = text else { return }

        // MARK: - Create "NSMutableAttributedString" with your text
        let attributedString = NSMutableAttributedString(string: textString)

        // MARK: - Create instance of "NSMutableParagraphStyle"
        let paragraphStyle = NSMutableParagraphStyle()

        // MARK: - Actually adding spacing we need to ParagraphStyle
        paragraphStyle.lineSpacing = spacingValue

        // MARK: - Adding ParagraphStyle to your attributed String
        attributedString.addAttribute(
            .paragraphStyle,
            value: paragraphStyle,
            range: NSRange(location: 0, length: attributedString.length
        ))

        // MARK: - Assign string that you've modified to current attributed Text
        attributedText = attributedString
    }

}

และการใช้งาน:

let yourLabel = UILabel()
let yourText = "Hello \n world \n !"
yourLabel.text = yourText
yourLabel.addInterlineSpacing(spacingValue: 1.5)

แน่นอนว่าจะใช้ได้ก็ต่อเมื่อคุณใช้UILabel.textไม่ใช่UILabel.attributedText
Jeroen

9

คุณสามารถใช้ส่วนขยายที่ใช้ซ้ำได้นี้:

extension String {

func lineSpaced(_ spacing: CGFloat) -> NSAttributedString {
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = spacing
    let attributedString = NSAttributedString(string: self, attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])
    return attributedString
}
}

5

Swift 4 และ Swift 5

extension NSAttributedString {
    func withLineSpacing(_ spacing: CGFloat) -> NSAttributedString {


        let attributedString = NSMutableAttributedString(attributedString: self)
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineBreakMode = .byTruncatingTail
        paragraphStyle.lineSpacing = spacing
        attributedString.addAttribute(.paragraphStyle,
                                      value: paragraphStyle,
                                      range: NSRange(location: 0, length: string.count))
        return NSAttributedString(attributedString: attributedString)
    }
}

วิธีใช้

    let example = NSAttributedString(string: "This is Line 1 \nLine 2 \nLine 3 ").withLineSpacing(15)
    testLabel.attributedText = example

ตัวอย่าง


สุดยอด! ประหยัดเวลาของฉัน!
Codetard

4

คำตอบของ Dipen อัปเดตสำหรับ Swift 4

let attr = NSMutableAttributedString(string: today)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 2
attr.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attr.length))
label.attributedText = attr;

1
//Swift 4:
    func set(text:String,
                         inLabel:UILabel,
                         withLineSpacing:CGFloat,
                         alignment:NSTextAlignment){
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.lineSpacing = withLineSpacing
            let attrString = NSMutableAttributedString(string: text)
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle,
                                    value:paragraphStyle,
                                    range:NSMakeRange(0, attrString.length))
            inLabel.attributedText = attrString
            inLabel.textAlignment = alignment
          }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.