Cách tăng khoảng cách dòng trong UILabel trong Swift


94

Tôi có một nhãn có ít dòng văn bản và tôi muốn tăng khoảng cách giữa các dòng. Có những câu hỏi tương tự được hỏi bởi những người khác nhưng các giải pháp không giải quyết được vấn đề của tôi. Ngoài ra nhãn của tôi có thể có hoặc không có đoạn văn. Tôi là người mới Swift. Có giải pháp nào sử dụng bảng phân cảnh không? Hoặc chỉ thông qua NSAttributedStringnó có thể?

Câu trả lời:


175

Thêm LineSpacing UILabeltheo chương trình vào đoạn mã sau của bạn .

Phiên bản Swift trước đó

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

Swift 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
Điều này cho thấy lỗi "Giá trị của loại 'NSAttributedString' không có thành viên 'addAttribute'".
Sneha

2
Chúng ta cần sử dụng NSMutableAttributedStringthay thế NSAttributedString. Tôi đã cập nhật asnwer.
Dipen Panchasara

1
Làm việc với Fonts tùy chỉnh cũng vĩ đại @ Dipen Panchasara
Abdul Karim

7
Tôi không biết tại sao nhưng, đối với tôi, đây là chỉ làm việc nếu bạn thiết lập linespacing> = 1, tôi đã cố gắng để thiết lập 0.5 / 0,75, nó không có tác dụng
Aximem

2
Không cần NSMutableAttributedString. Có thể sử dụngNSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle : paragraphStyle])
bauerMusic

101

Từ Trình tạo giao diện:

nhập mô tả hình ảnh ở đây

Lập trình:

SWift 4 & 4.2

Sử dụng phần mở rộng nhãn

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

Chức năng mở rộng cuộc gọi hiện hành

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

Hoặc sử dụng phiên bản nhãn (Chỉ cần sao chép và thực thi mã này để xem kết quả)

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

Swift 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" có lỗi, tôi đã sử dụng "NSParagraphStyleAttributeName" để thay thế.
Ahmadreza 14/02/18

@Alfi - Đó là sự khác biệt của phiên bản ngôn ngữ Swift. Lang nhanh của dự án của bạn. phiên bản có thể là 3.x nhanh chóng và đây là câu trả lời cho cả hai phiên bản. Hãy thử với mã Swift 3.
Krunal

Xin chào @krunal, tôi đã đặt Linespacing và LineHeight trong Interface và tôi đã đặt văn bản trong UILabel Programmatic nhưng nó không hoạt động. nếu tôi thêm văn bản trong Giao diện thì nó hoạt động. bạn có thể vui lòng giúp tôi về điều này Cảm ơn bạn và tôi cũng đã đặt văn bản và văn bản thuộc tính trong UILabel nhưng cách tiếp cận đó không hiệu quả với tôi.
Yogesh Patel

giải pháp xây dựng giao diện chỉ dành cho văn bản tĩnh. khi chúng tôi thêm chuỗi phân bổ trong mã, những thuộc tính được thêm vào từ trình tạo giao diện sẽ không được áp dụng.
Yodagama

66

Bạn có thể kiểm soát khoảng cách dòng trong storyboard.

nhập mô tả hình ảnh ở đây

Câu hỏi tương tự.


8
Tôi thực sự đã thử điều này. Nhưng nó không hoạt động. Ngoài ra, điều này không hữu ích cho các phông chữ tùy chỉnh.
Sneha

Nếu bạn đang phải đối mặt với việc căn chỉnh sai trong phông chữ tùy chỉnh, hãy cố gắng cập nhật thuộc ascendertính như được đề cập ở đây .
pkc456

1
Nó không phải là vấn đề căn chỉnh sai. Tôi không thể chọn phông chữ tùy chỉnh của mình với giải pháp mà bạn đã nói @ pkc456
Sneha

Nó không phải là vấn đề căn chỉnh sai. Tôi không thể chọn phông chữ tùy chỉnh của mình, nhưng bây giờ tôi đã giải quyết điều đó bằng cách thêm Phông chữ của mình thông qua cài đặt riêng biệt trong Attributed. Nhưng vẫn giữ nguyên khoảng cách. @ Pkc456
Sneha

15
Điều này chỉ dành cho văn bản tĩnh. Hãy thử thêm chương trình văn bản. Điều này sẽ không hoạt động.
Sneha

11

Giải pháp gần đây cho 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
    }

}

Và cách sử dụng:

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

Tất nhiên, điều này sẽ chỉ hoạt động nếu bạn đang sử dụng UILabel.textvà khôngUILabel.attributedText
Jeroen

9

Bạn có thể sử dụng tiện ích mở rộng có thể tái sử dụng này:

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

Cách sử dụng

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

Thí dụ


Tuyệt vời! Tiết kiệm thời gian của tôi!
Codetard

4

Câu trả lời của Dipen đã được cập nhật cho 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
          }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.