Đặt giãn cách dòng UILabel


Câu trả lời:


122

Chỉnh sửa: Rõ ràng là NSAttributedStringsẽ làm được, trên iOS 6 trở lên. Thay vì sử dụng một NSStringđể đặt văn bản của nhãn, hãy tạo một NSAttributedString, đặt các thuộc tính trên nó, sau đó đặt nó làm nội dung .attributedTexttrên nhãn. Mã bạn muốn sẽ giống như sau:

NSMutableAttributedString* attrString = [[NSMutableAttributedString  alloc] initWithString:@"Sample text"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:24];
[attrString addAttribute:NSParagraphStyleAttributeName
    value:style
    range:NSMakeRange(0, strLength)];
uiLabel.attributedText = attrString;

Quy tắc cũ của NSAttributedString đã làm điều tương tự, nhưng bây giờ điều đó không được dùng nữa.

Vì lý do lịch sử, đây là câu trả lời ban đầu của tôi:

Câu trả lời ngắn gọ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 UILabelvà cuộn của riêng bạn drawTextInRect, tạo nhiều nhãn hoặc sử dụng một phông chữ khác (có lẽ một phông chữ đã được chỉnh sửa cho chiều cao dòng cụ thể, hãy xem câu trả lời của Phillipe).

Câu trả lời dài: Trong thế giới báo in và trực tuyến, khoảng cách giữa các dòng văn bản được gọi là "hàng đầu" (vần với 'đề mục', và xuất phát từ kim loại chì được sử dụng nhiều thập kỷ trước). Dẫn đầu là thuộc tính chỉ đọc UIFont, đã không còn được dùng trong 4.0 và được thay thế bằng lineHeight. Theo như tôi biết, không có cách nào để tạo ra một phông chữ với một bộ thông số cụ thể như lineHeight; bạn nhận được phông chữ hệ thống và bất kỳ phông chữ tùy chỉnh nào bạn thêm vào, nhưng không thể chỉnh sửa chúng sau khi cài đặt.

Không có tham số khoảng cách trong UILabel.

Tôi không đặc biệt hài lòng với UILabelhành vi của hiện tại, vì vậy tôi khuyên bạn nên viết lớp con của riêng bạn hoặc sử dụng thư viện của bên thứ ba. Điều đó sẽ làm cho hành vi độc lập với lựa chọn phông chữ của bạn và là giải pháp có thể tái sử dụng nhiều nhất.

Tôi muốn có được linh hoạt hơn trong UILabel, và tôi muốn được hạnh phúc để được chứng minh sai!


1
Tôi đã làm điều đó với UILabel phân loại phụ, ý tưởng về cơ bản là chia văn bản nhãn thành các mã thông báo và sau đó là độ dài nhận dạng của mỗi mã thông báo, tạo một nhãn riêng cho từng mã thông báo và nối lần lượt. Đó là nó.
Matrix

3
Dối trá! ;) Bạn có thể vá một tệp phông chữ để thay đổi chiều cao dòng - xem câu trả lời của tôi trên trang này.
Philippe

Tôi tin rằng có một cách để làm điều này với NSAttributedString. Nếu bạn cần các nhãn có chuỗi phân bổ trong iOS 6 trước, hãy xem OHAttributedLabel .
Spencer Williams

Làm điều đó với NSAttributesString nếu bạn sử dụng iOS> = 6. Ví dụ
d.ennis

Điều này là đơn giản và hoạt động tốt.
R. Mohan

75

Bắt đầu từ ios 6, bạn có thể đặt một chuỗi phân bổ trong UILabel:

NSString *labelText = @"some text"; 
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:labelText];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineSpacing:40];
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [labelText length])];
cell.label.attributedText = attributedString ;

1
cảm ơn! Tôi sẽ thêm điều đó bằng cách sử dụng chức AttributedStringnăng vô hiệu hóa căn chỉnh văn bản của nhãn ví dụ, vì vậy bạn phải thêm nó vào kiểu đoạn văn.
cyborg86pl

56

Bạn có thể kiểm soát khoảng cách dòng trong bảng phân cảnh:

câu hỏi trùng lặp


10
Tuy nhiên trong Xcode 6.1.1, việc chọn nhãn và thay đổi giá trị dòng trong bảng phân bổ sẽ khiến bảng nhấp nháy và khóa ứng dụng. Tôi chỉ có thể thoát khỏi bảng điều khiển bằng cách buộc thoát khỏi Xcode.
izk

4
Thích

1
Trong phiên bản 7.1, bảng điều khiển nhấp nháy và nó không có bất kỳ ảnh hưởng nào đến thời gian chạy. Phải làm điều đó trong mã.
MiguelSlv

440 watt điện chạy qua bảng điều khiển của tôi chỉ là bây giờ;)
Sarasranglt

23

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

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

Lập trình:

SWift 4

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

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

Cần phải vượt qua chỉ có một lineSpacing đối số hoặc multipleLineheight, t có thể vượt qua cả arguenemt khác khôn ngoan không có kết quả sẽ đến, tôi nghĩ rằng
Arpit B Parekh

16

Giải pháp của tôi là tự vá tệp phông chữ và sửa chiều cao dòng của nó chắc chắn. http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

Tôi đã phải sửa đổi 'lineGap', 'ascender', 'Lowernder' trong khối 'hhea' (như trong ví dụ blog).


Siêu mát! Các công cụ phông chữ OS X đó cũng hoạt động với phông chữ OTF của tôi (mặc dù nó chỉ chỉ định TTF ...). Phông chữ của tôi có độ cao dòng 1000 (!), Tôi đã đổi thành 0 và thì đấy. Tôi có dặm không gian trống bên dưới văn bản trên mỗi dòng.
Jonny

2
Tôi không thể tin rằng đây là giải pháp tốt nhất (không vi phạm!), Nhưng nó là đơn giản nhất. Tôi đã sử dụng phần mềm miễn phí (Windows) Type Light (và trong Font | Metrics | Advanced, bạn có thể sửa đổi lineGap) để chỉnh sửa phông chữ của mình. Nó cũng cho phép bạn "đổi tên" các phông chữ, điều mà tôi không thể tìm ra cách thực hiện bằng công cụ mà Philippe đã đề cập.
Kirk Woll

Thật tuyệt vời @Philippe! Cảm ơn vì bài đăng!!
Robbie

Ngoài ra, hãy xem câu trả lời của tôi cho một câu hỏi tương tự để biết thêm chi tiết cụ thể: stackoverflow.com/a/19553827/201828
phatmann

@iamjustaprogrammer Nó lại trực tuyến rồi.
Matt B.


7

Điều tốt nhất tôi tìm thấy là: https://github.com/mattt/TTTAttributedLabel

Đó là một lớp con UILabel nên bạn có thể chỉ cần thả nó vào, sau đó thay đổi chiều cao dòng:

myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;


2

Đây là một số mã nhanh để bạn đặt giãn cách dòng theo chương trình

let label = UILabel()

let attributedText = NSMutableAttributedString(string: "Your string")
let paragraphStyle = NSMutableParagraphStyle()

//SET THIS:
paragraphStyle.lineSpacing = 4
//OR SET THIS:
paragraphStyle.lineHeightMultiple = 4

//Or set both :)

let range = NSMakeRange(0, attributedText.length)
attributedText.addAttributes([NSParagraphStyleAttributeName : paragraphStyle], range: range)
label.attributedText = attributedText

0

Tất nhiên, câu trả lời của Mike sẽ không hoạt động nếu bạn chuyển chuỗi theo chương trình. Trong trường hợp này, bạn cần chuyển một chuỗi phân bổ và thay đổi kiểu của nó.

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;
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.