设置UILabel行间距

Mat*_*rix 101 objective-c multiline uilabel ios line-spacing

如何修改多行中的行间距(行间距)UILabel

And*_*ewS 121

编辑:显然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;
Run Code Online (Sandbox Code Playgroud)

NSAttributedString的老attributedStringWithString做同样的事情,但现在已被弃用.

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

简短的回答:你做不到.要更改文本行之间的间距,您必须子类化UILabel并滚动自己的文本,drawTextInRect创建多个标签或使用不同的字体(可能是针对特定行高编辑的字体,请参阅Phillipe的答案).

答案很长:在印刷和网络世界中,文本行之间的空间被称为"领先"(与"标题"押韵,并且来自几十年前使用的铅金属).Leading是一个只读属性UIFont,在4.0中已弃用并替换为lineHeight.据我所知,没有办法创建一个具有一组特定参数的字体,如lineHeight; 你得到系统字体和你添加的任何自定义字体,但安装后无法调整它们.

也没有间距参数UILabel.

我对这种UILabel行为并不是特别满意,因此我建议您编写自己的子类或使用第三方库.这将使行为独立于您的字体选择,并成为最可重用的解决方案.

我希望有在更多的灵活性UILabel,并且我很乐意被证明是错误的!

  • 谎言!;)您可以修补字体文件以更改行高 - 请参阅本页的答案. (3认同)

ios*_*ist 75

从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 ;
Run Code Online (Sandbox Code Playgroud)


Mik*_*e S 56

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

重复的问题

  • 但是在Xcode 6.1.1中,选择标签并更改属性面板中的线值将导致面板闪烁并锁定应用程序.我只能通过强制退出Xcode退出面板. (10认同)
  • 竖起大拇指动画 (4认同)

Kru*_*nal 18

来自Interface Builder:

在此输入图像描述

编程方式:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

现在调用扩展功能

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
Run Code Online (Sandbox Code Playgroud)


或使用标签实例(只需复制并执行此代码即可查看结果)

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
Run Code Online (Sandbox Code Playgroud)

斯威夫特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
Run Code Online (Sandbox Code Playgroud)


Phi*_*ppe 16

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

我不得不修改'hhea'块中的'lineGap','ascender','descender'(如博客示例中所示).

  • 我无法相信这是最好的解决方案(没有冒犯!),但它是迄今为止最简单的解决方案.我使用免费的(Windows)软件[Type Light](http://www.cr8software.net/typelight.html)(在Font | Metrics | Advanced下你可以修改lineGap)来编辑我的字体.它还允许您"重命名"字体,我无法弄清楚如何使用Philippe提到的工具. (2认同)

adr*_*nat 8

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


lms*_*lms 7

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

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

myLabel.lineHeightMultiple = 0.85;
myLabel.leading = 2;
Run Code Online (Sandbox Code Playgroud)