Câu trả lời:
Chỉnh sửa: Rõ ràng là NSAttributedString
sẽ 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 .attributedText
trê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 UILabel
và 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 UILabel
hà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!
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 ;
AttributedString
nă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.
Bạn có thể kiểm soát khoảng cách dòng trong bảng phân cảnh:
Từ Trình tạo giao diện:
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
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).
Anh chàng này đã tạo một lớp để lấy chiều cao dòng (mà không sử dụng CoreText, làm thư viện MTLabel): https://github.com/LemonCake/MSLabel
Đ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;
Tôi đã tìm thấy Thư viện của bên thứ 3 Giống như thư viện này:
https://github.com/Tuszy/MTLabel
Để trở thành giải pháp dễ dàng nhất.
Đâ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
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;