设置UILabel行间距

如何修改多行UILabel行间距(行间距)?

编辑:很明显, NSAttributedString将在iOS 6和更高版本中执行此操作。 不是使用NSString来设置标签的文本, NSAttributedString创build一个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的旧的attributesStringWithString做了同样的事情,但现在已被弃用。

由于历史原因,这是我的原始答案:

简短的回答:你不能。 要改变文本行之间的间距,你必须UILabel子类,并滚动你自己的drawTextInRect ,创build多个标签,或者使用不同的字体(可能是为特定行高编辑的,参见Phillipe的答案)。

漫长的回答:在印刷和networking世界中,文本之间的空间被称为“领先”(用“标题”来表示,来自几十年前使用的铅金属)。 Leading是UIFont的只读属性,它在4.0中被弃用,被lineHeight取代。 据我所知,没有办法创build一个特定的一组参数,如lineHeight ; 你得到系统字体和你添加的任何自定义字体,但是一旦安装就不能调整它们。

UILabel也没有间距参数。

我对UILabel的行为不是特别满意,所以我build议编写自己的子类或使用第三方库。 这将使行为独立于您的字体select,成为最可重用的解决scheme。

我希望UILabel有更大的灵活性,我很乐意被certificate是错误的!

从ios 6开始,您可以在UILabel中设置一个属性string:

 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 ; 

您可以控制故事板中的行距:

重复的问题

我的解决scheme是修补字体文件本身,并确定其行高。 http://mbauman.net/geek/2009/03/15/minor-truetype-font-editing-on-a-mac/

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

这家伙创build了一个类来获得行高(不使用CoreText,作为MTLabel库): https : //github.com/LemonCake/MSLabel

我发现最好的东西是: https : //github.com/mattt/TTTAttributedLabel

这是一个UILabel子类,所以你可以把它放进去,然后改变行高:

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

从界面生成器:

在这里输入图像描述

编程方式:

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

现在调用扩展function

 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 

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 

我find了第三方图书馆就像这样:

https://github.com/Tuszy/MTLabel

成为最简单的解决scheme。

这里有一些swift代码,您可以通过编程设置行距

 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 

当然,如果以编程方式传递string,Mike的答案不起作用。 在这种情况下,你需要传递一个属性string,并改变它的风格。

 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;