2010-10-07 87 views

回答

114

編輯:很明顯,NSAttributedString會在iOS 6及更高版本中完成此操作。不使用NSString來設置標籤的文本,而是創建一個NSAttributedString,在其上設置屬性,然後將其設置爲標籤上的.attributedText。你想要的代碼將是這樣的:

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; 

NSAttributedString的老attributedStringWithString做同樣的事情,但現在已被棄用。

由於歷史的原因,這是我原來的答覆:

簡短的回答:你不能。要改變文本行之間的間距,您必須繼承UILabel的子類並滾動自己的drawTextInRect,創建多個標籤或使用不同的字體(可能是爲特定行高編輯的一個,請參閱Phillipe的答案)。在印刷和網絡世界中,文本行之間的空間被稱爲「領先」(用'標題'押韻,並且來自幾十年前使用的鉛金屬)。領先是UIFont的只讀屬性,它在4.0中被棄用,並被lineHeight取代。據我所知,沒有辦法創建一個具有一組特定參數的字體,如lineHeight;您可以獲得系統字體和您添加的任何自定義字體,但安裝後無法調整它們。

UILabel也沒有間距參數。

我並不特別滿意UILabel的行爲,所以我建議編寫自己的子類或使用第三方庫。這將使行爲獨立於您的字體選擇併成爲最可重用的解決方案。

我希望那裏UILabel更靈活,我很樂意被證明是錯誤的!

+1

我與子類的UILabel做到了,基本上想法是標籤文本劃分成標記,然後每個令牌的身份長度,對於每個令牌創建一個單獨的標籤和追加相繼。而已。 – Matrix 2010-10-13 11:41:50

+3

謊言! ;)你可以修補一個字體文件來改變行高 - 在這個頁面上看到我的答案。 – Philippe 2012-09-03 20:14:57

+0

我[讓我相信](http://stackoverflow.com/a/8162907/1167833)有一種方法可以用NSAttributedString來做到這一點。如果您需要iOS 6以前的屬性字符串標籤,請查看[OHAttributedLabel](https://github.com/AliSoftware/OHAttributedLabel)。 – 2013-01-26 01:12:50

15

我的解決辦法來修補字體文件本身,肯定解決了線的高度。 http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

我不得不修改'hhea'塊中的'lineGap','ascender','descender'(如在博客示例中)。

+0

超酷!這些OS X字體工具也適用於我的OTF字體(儘管它僅指定TTF ...)。我的字體有行高1000(!),我把它改爲0,並且瞧。我在每行文本下面有幾英里和幾英里的空白空間。 – Jonny 2012-08-29 07:01:14

+2

我不敢相信這是最好的解決方案(沒有冒犯!),但它是迄今爲止最簡單的。我使用免費的(Windows)軟件[Type Light](http://www.cr8software.net/typelight.html)(在Font | Metrics | Advanced下可以修改lineGap)來編輯我的字體。它也允許你「重新命名」字體,我無法弄清楚如何使用Philippe提到的工具。 – 2012-11-29 02:16:34

+0

這太棒了@Philippe!感謝帖子! – Robbie 2013-01-14 21:39:56

74

在IOS開始6可以設置在的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

謝謝!我會補充說,使用'AttributedString'禁用例如標籤的文本對齊,所以你必須將其添加到段落樣式。 – cyborg86pl 2013-10-30 13:55:32

+0

謝謝你,你救了我的命! – 2014-03-01 15:34:05

7

最好的事情是:https://github.com/mattt/TTTAttributedLabel

它是一個UILabel子類,所以你能把它,然後改線高度:

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

myLabel.leading = 2;不工作 – 2017-09-04 04:45:21

46

您可以在故事板控制線間距:

duplicate question

+10

但是,在Xcode 6.1.1中,選擇標籤並更改屬性面板中的行值將導致面板閃爍並鎖定應用程序。我只能通過強制退出Xcode退出面板。 – izk 2014-12-22 19:35:27

+4

動畫豎起大拇指 – Tieme 2014-12-23 16:20:48

+1

在版本7.1中,面板輕彈,它對運行時間沒有任何影響。必須在代碼中完成。 – ByteArtisan 2015-11-15 15:31:16

0

當然,如果你把這個字符串編程小李的答案是行不通的。在這種情況下,您需要傳遞屬性字符串並更改其樣式。

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

下面是一些快速的代碼爲你設定的行編程

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 
7

間距從界面生成器:

enter image description here

編程:

SWIFT 4

使用標籤擴展

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

現在調用擴展功能

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 


或者使用標籤實例(只需複製&執行該代碼,看看結果)

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