Cách kiểm soát khoảng cách dòng trong UILabel


273

Có thể giảm khoảng cách giữa các văn bản, khi đặt trong nhiều dòng trong một UILabel? Chúng ta có thể đặt khung, cỡ chữ và số dòng. Tôi muốn giảm khoảng cách giữa hai dòng trong nhãn đó.



2
Tôi có thể đề nghị bạn chấp nhận một trong những câu trả lời đúng cho iOS 6.0 trở lên không? Câu trả lời hiện đang được chấp nhận là hết hạn.
Đánh dấu Amery

Đối với mỗi dòng sử dụng một cái mới UILabel, sau đó nhúng tất cả các nhãn vào a StackView. Cuối cùng điều chỉnh spacingcủa StackView. Nhớ xếp chúng theo chiều dọc.
Mật ong

Tham khảo liên kết sau để biết giải pháp trong Swift 2. stackoverflow.com/a/39158698/6602495
Sneha

Tham khảo stackoverflow.com/a/44325650/342794 để biết điều chỉnh bảng phân cảnh và các chi tiết khác.
lal

Câu trả lời:


261

Tôi đã nghĩ về việc thêm một cái gì đó mới vào câu trả lời này, vì vậy tôi không cảm thấy tệ như vậy ... Đây là câu trả lời của Swift :

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

"Câu trả lời ngắn: bạn không thể. Để thay đổi khoảng cách giữa các dòng văn bản, bạn sẽ phải phân lớp UILabel và cuộn drawTextInRect của riêng bạn hoặc tạo nhiều nhãn."

Xem: Đặt khoảng cách dòng UILabel


Đây là một câu trả lời thực sự cũ và khác đã bổ sung cách mới và tốt hơn để xử lý vấn đề này .. Vui lòng xem các câu trả lời cập nhật được cung cấp dưới đây.


23
Kể từ iOS 6.0, bạn có thể điều khiển nó thông qua NSAttributedString(cũng có sẵn trong các thuộc tính của UILable trong trình tạo giao diện của Xcode).
ɾɾɾǝʞ

13
Thật thú vị, gần như tôi có thể nói, bạn có thể thêm khoảng cách giữa các dòng, nhưng không giảm bớt thông qua NSParagraphStylekhi sử dụng một NSAttributedString. (Tôi có thể cần thực hiện thêm thử nghiệm các thuộc tính có thể sửa đổi khác, nhưng thuộc lineSpacingtính chỉ cho phép bạn tăng nó.)
LivingTech

xem câu trả lời của tôi để xem cách sử dụng NSAttributionString
d.ennis

2
@livingtech Điều đó thật đáng giận, và tôi tin bạn đã đúng. Bạn đã tìm thấy bất kỳ cách giải quyết?
Dom Vinyard

7
Chỉ cần làm rõ một cái gì đó trong chủ đề này. Nếu bạn muốn giảm bớt khoảng cách giữa các dòng thiết lập chiều cao dòng đến 1.0, và sau đó setLineHeightMultiple đến một giá trị thấp <1,0, như: [paragraphStyle setLineHeightMultiple: 0,8] hoặc paragraphStyle.lineHeightMultiple = 0,8
virsunen

401

Trong Xcode 6, bạn có thể làm điều này trong bảng phân cảnh:

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


1
Tận dụng lợi thế của bảng phân cảnh!
Allen

22
@PaperThick có cùng một vấn đề trong 6.1.1. Nó "lắc lắc" trong vài phút. Không biết cách khắc phục :) Xcode Lắc
Anton Gaenko 16/1/2015

8
Có cách nào để đặt phông chữ tùy chỉnh theo cách này không? Tôi dường như không thể thay đổi helvetica neue sang bất kỳ phông chữ nào khác.
Marcos Curvello

2
Nếu bạn bật 'Được phân bổ', rồi mở tệp dưới dạng mã nguồn, bạn có thể chỉnh sửa 'lineHeightMult Môn' theo cách thủ công và do đó bỏ qua lỗi Harlem Shake
ED-209

2
@azdev cho bất cứ ai vẫn nhìn vào điều này, tôi sẽ nhận được sự rung chuyển lâu hơn trong Xcode 7.3, nhưng tôi nghĩ đây là phiên bản đầu tiên không gặp sự cố
LulzCow

103

Bắt đầu từ iOS 6, bạn có thể đặt một chuỗi được gán cho UILabel. Kiểm tra lượt theo dõi :

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
Các attributedStringphải là một NSMutableAttributedString(KHÔNG NSAttributedString)
Mike S

14
Mã dòng đầu tiên phải làNSMutableAttributedString *attributedString = [NSMutableAttributedString alloc]initWithString:@"sample text"];
Allen

Các lineSpacingtài sản của NSMutableParagraphStylekhông bao giờ là tiêu cực, vì vậy chiều cao dòng không thể được giảm với cách tiếp cận này. Để trả lời câu hỏi, bạn phải sử dụng một thuộc tính khác, xem @ d.ennis trả lời.
Theo

81

Các giải pháp được nêu ở đây không làm việc cho tôi. Tôi đã tìm thấy một cách hơi khác để làm điều đó với NSAttributionString trên iOS 6:

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
Chiều cao dòng là kích thước phông chữ phụ thuộc. Khoảng cách dòng chỉ là, khoảng cách dòng. Bạn có thể giải quyết mọi thứ bằng cách chỉ đặt chiều cao dòng tối thiểu / tối đa, nhưng đó chỉ là do kích thước phông chữ hiện tại bạn đang sử dụng không lớn hơn ranh giới chiều cao của dòng. Theo tài liệu: "... glyphs và đồ họa vượt quá độ cao này sẽ chồng lấp các dòng lân cận ... Mặc dù giới hạn này áp dụng cho chính dòng đó, khoảng cách dòng sẽ thêm không gian giữa các dòng liền kề."
Ari Braginsky

+1, Nếu bạn muốn giảm khoảng cách giữa các dòng, đây là điều bạn muốn làm. Khoảng cách dòng thực rất có thể là 0 theo mặc định, đây là lý do tại sao mọi người báo cáo bạn chỉ có thể tăng nó. Vấn đề với khoảng cách quá lớn xuất phát từ chiều cao của dòng quá lớn, đây là lý do tại sao điều này sẽ hoàn thành công việc 99%.
lawicko 10/03/2015

1
Đây là câu trả lời duy nhất tôi có thể tìm thấy sử dụng giá trị chiều cao dòng thực tế (thay vì tỷ lệ) phổ biến cho các ứng dụng thiết kế như Photoshop, Phác thảo, CSS, v.v.
Albert Bori

35

Tôi đã thực hiện tiện ích mở rộng đơn giản này hoạt động rất tốt cho tôi:

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

Sao chép này trong một tập tin, vì vậy sau đó bạn có thể sử dụng nó như thế này

myLabel.setLineHeight(0.7)

hãy nhớ nếu bạn làm điều này trong khi bạn cũng đang sử dụng Storyboard cho nhãn này, thì hãy chắc chắn đặt các dòng của nhãn của bạn thành 0
Honey

Tại sao bạn không trực tiếp đặt lineSpacingvà quên cài đặt lineHeightMultiple?
Mật ong

Bởi vì chìa khóa để giảm chiều cao của dòng là 'lineHeightMultipl', không có lineSpaces
Agustin Meriles

nói rằng bạn muốn chiều cao của bạn là 1,4, tại sao bạn không thể viết .lineSpacing = 1.4và quên tất cả về .lineHeightMultiple...
Honey

Hừ! Tôi đã thử và tôi không làm việc, nhưng tôi tự hỏi tại sao tôi không thấy các câu trả lời khác ở đây không sử dụng cơ chế của bạn, ý tôi là họ chỉ trực tiếp đặt lineSpaces. Xem câu trả lời được chấp nhận ...
Mật ong

33

Từ Trình tạo giao diện (Storyboard / XIB):

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

Lập trình:

Vuốt 4

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

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

Bây giờ gọi chức năng mở rộng

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

Hoặc sử dụng thể hiệ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 = "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

Swift 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
Thêm dòng "đoạnStyle.alocation = self.textAlocation" để giữ căn chỉnh ban đầu. Nếu không, văn bản sẽ được căn trái.
Nithin Michael

Đối với bất kỳ ai mất dấu chấm lửng trên các văn bản lớn, sau đó sử dụng: đoạnStyle.lineBreakMode = .byTruncatingTail
christostsang



11

Trong Swift và như một chức năng, lấy cảm hứng từ DarkDust

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

Theo câu trả lời của @Mike, giảm điểm lineHeightMultiplelà điểm mấu chốt. Ví dụ dưới đây, nó hoạt động tốt cho tôi:

    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

SWift 3 tiện ích mở rộng hữu ích để đặt không gian giữa các dòng dễ dàng hơn :)

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

Tôi đã tìm thấy một cách mà bạn có thể đặt chiều cao của dòng thực (không phải là một yếu tố) và nó thậm chí còn hiển thị trực tiếp trong Trình tạo giao diện . Chỉ cần làm theo các hướng dẫn dưới đây. Mã được viết bằng Swift 4 .


Bước # 1: Tạo một tệp có tên DesignableLabel.swiftvà chèn đoạn mã sau:

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

Bước # 2: Đặt a UILabelvào Storyboard / XIB và đặt lớp của nó thành DesignableLabel. Đợi dự án của bạn xây dựng (xây dựng phải thành công!).

Chỉ định lớp cho UILabel của bạn


Bước 3: Bây giờ bạn sẽ thấy một thuộc tính mới trong khung thuộc tính có tên "Chiều cao đường". Chỉ cần đặt giá trị bạn thích và bạn sẽ thấy kết quả ngay lập tức!

Đặt chiều cao dòng trong thuộc tính


2

Dưới đây là một lớp con của UILabel thiết lập lineHeightMultiplevà đảm bảo chiều cao nội tại đủ lớn để không cắt văn bản.

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

phần đệm thêm phải là (lineHeightMult Môn - 1.0) * font.pointSize, phải không?
Pavel Alexeev

Các mã ở trên dường như làm việc cho tôi. Nhưng có lẽ bạn đúng. Bạn đã thử thay đổi của bạn? @PavelAlexeev
phatmann

Không, tôi gắn bó với lineSpaces thay vì lineHeightMultipl :)
Pavel Alexeev

1

Trong Swift 2.0 ...

Thêm một phần mở rộng:

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

Bây giờ, chỉ cần đặt UILabel của bạn là AttText:

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

Rõ ràng, tôi đã thêm một loạt các tham số mà bạn có thể không cần. Chơi xung quanh - thoải mái viết lại phương pháp - Tôi đã tìm kiếm điều này trên một loạt các câu trả lời khác nhau để tìm ra tôi sẽ đăng toàn bộ phần mở rộng trong trường hợp nó giúp được ai đó ngoài kia ...


1

Swift3 - Trong tiện ích mở rộng UITextView hoặc UILabel, hãy thêm chức năng này:

Tôi đã thêm một số mã để giữ văn bản được gán hiện tại nếu bạn đang sử dụng các chuỗi được gán với chế độ xem (thay vì ghi đè lên chúng).

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

Một câu trả lời khác ... Nếu bạn truyền chuỗi theo lập trình, bạn cần chuyển một chuỗi được gán thay vì một chuỗi thông thường và thay đổi kiểu của nó. (IOS10)

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

Tiện ích mở rộng Swift 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

Điều này sẽ giúp với nó. Sau đó, bạn có thể gán nhãn của mình cho lớp tùy chỉnh này trong bảng phân cảnh và sử dụng tham số của nó trực tiếp trong các thuộc tính:

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

Điều này sẽ giúp với nó. Sau đó, bạn có thể gán nhãn của mình cho lớp tùy chỉnh này trong bảng phân cảnh và sử dụng tham số của nó trực tiếp trong các thuộc tính.
Russell Warwick

xin vui lòng không đặt nội dung liên quan đến câu trả lời của bạn trong các ý kiến. câu trả lời của bạn sẽ hữu ích mà không cần phải đọc qua các bình luận
Neuron

1

Mở rộng nhãn 4 Swift. Tạo NSMutableAttributionString trước khi chuyển vào hàm trong trường hợp có các thuộc tính bổ sung cần thiết cho văn bản được gán.

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

Mã này hoạt động với tôi (chắc chắn ios 7 & ios 8).

_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

Đây là giải pháp của tôi trong nhanh chóng. Lớp con nên hoạt động cho cả thuộc tính văn bản và thuộc tính văn bản và cho characterSpaces + lineSpaces. Nó giữ lại khoảng cách nếu một chuỗi mới hoặc AttributionString được đặt.

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

Như một cách giải quyết nhanh chóng-bẩn-thông minh-đơn giản:

Đối với UILabels không có nhiều dòng, thay vào đó bạn có thể sử dụng stackViews.

  1. Đối với mỗi dòng viết một nhãn mới.
  2. Nhúng chúng vào StackView. (Chọn cả hai nhãn -> Trình chỉnh sửa -> Nhúng vào -> StackView
  3. Điều chỉnh SpacingStackView theo số lượng bạn muốn

Hãy chắc chắn để xếp chúng theo chiều dọc . Giải pháp này cũng hoạt động cho các phông chữ tùy chỉnh.

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


FWIW đây là một giải pháp tuyệt vời nhưng hoàn toàn khả thi. Do đó tôi đang giữ nó.
Mật ong

Tôi cũng đã thấy một nhà phát triển iOS sử dụng stackview để tạo biểu đồ. Stackview rất mạnh mẽ
Honey
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.