如何控制UILabel中的行间距

Abh*_*nav 261 xcode objective-c uilabel swift line-spacing

当放入多行中时,是否可以缩小文本之间的差距UILabel?我们可以设置框架,字体大小和行数.我想减少该标签中两行之间的差距.

Mik*_*e S 393

在Xcode 6中,您可以在故事板中执行此操作:

在此输入图像描述

  • @PaperThick在6.1.1中有同样的问题.它"哈利震动"几分钟.不知道如何解决它:) [Xcode Shaking](https://dl.dropboxusercontent.com/s/ln1phh80ka9jfcc/xcode_label_attributes_bug.gif?dl=0) (21认同)
  • 有没有办法以这种方式设置自定义字体?我似乎无法改变任何其他字体的helvetica neue. (8认同)
  • 如果您启用'Attributed',然后将该文件作为源代码打开,您可以手动编辑'lineHeightMultiple',从而绕过Harlem Shake错误 (2认同)
  • @azdev对于那些仍然在看这个的人来说,我在Xcode 7.3中的时间越来越震撼,但我认为这是第一个没有出现问题的版本 (2认同)

Maz*_*yod 249

我想在这个答案中加入新的东西,所以我感觉不那么糟糕......这是Swift的回答:

import Cocoa

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 40

let attrString = NSMutableAttributedString(string: "Swift Answer")
attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

var tableViewCell = NSTableCellView()
tableViewCell.textField.attributedStringValue = attrString
Run Code Online (Sandbox Code Playgroud)

"简答:你不能.要改变文本行之间的间距,你必须继承UILabel并滚动你自己的drawTextInRect,或者创建多个标签."

请参阅:设置UILabel行间距


这是一个非常古老的答案,其他已经添加了新的和更好的方法来处理这个..请查看下面提供的最新答案.

  • 从iOS 6.0开始,您可以通过`NSAttributedString`控制它(在Xcode的界面构建器中也可以在UILable的属性中使用). (22认同)
  • 有趣的是,就我所知,你可以在行之间添加额外的间距,但在使用`NSAttributedString`时不要通过`NSParagraphStyle`减少它.(我可能需要对其他可修改属性进行更多测试,但`lineSpacing`属性只允许你增加它.) (13认同)
  • 只是为了澄清这个帖子中的内容.如果要缩小行间距,请将行高设置为1.0,然后将setLineHeightMultiple设置为较低的值<1.0,如:[paragraphStyle setLineHeightMultiple:0.8]或paragraphStyle.lineHeightMultiple = 0.8 (7认同)
  • @livingtech真是令人生气,我相信你是正确的。您找到任何解决方法了吗? (2认同)

ios*_*ist 101

从iOS 6开始,您可以将属性字符串设置为UILabel.检查以下内容:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)];

label.attributedText = attributedString;
Run Code Online (Sandbox Code Playgroud)

  • 第一行代码应该是`NSMutableAttributedString*attributedString = [NSMutableAttributedString alloc] initWithString:@"sample text"];` (14认同)

d.e*_*nis 80

这里说的解决方案对我不起作用.我发现使用iOS 6 NSAttributeString的方式略有不同:

myLabel.numberOfLines = 0; 
NSString* string = @"String with line one. \n Line two. \n Line three.";
NSMutableParagraphStyle *style  = [[NSMutableParagraphStyle alloc] init];
style.minimumLineHeight = 30.f;
style.maximumLineHeight = 30.f;
NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:string
                                                         attributes:attributtes];   
[myLabel sizeToFit];
Run Code Online (Sandbox Code Playgroud)

  • 行高取决于字体大小。行距就是这样,行距。您可以通过设置最小/最大行高来解决问题,但这只是因为您使用的当前字体大小不大于行高边界。根据文档:“......超过此高度的字形和图形将与相邻行重叠......尽管此限制适用于行本身,但行间距会在相邻行之间增加额外的空间。” (2认同)
  • 这是我能找到的唯一使用设计应用程序(如 Photoshop、Sketch、CSS 等)常见的实际行高值(而不是比率)的答案。 (2认同)

Agu*_*les 34

我做了这个简单的扩展,对我来说非常好用:

extension UILabel {
    func setLineHeight(lineHeight: CGFloat) {
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = 1.0
        paragraphStyle.lineHeightMultiple = lineHeight
        paragraphStyle.alignment = self.textAlignment

        let attrString = NSMutableAttributedString()
        if (self.attributedText != nil) {
            attrString.append( self.attributedText!)
        } else {
            attrString.append( NSMutableAttributedString(string: self.text!))
            attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
        }
        attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
        self.attributedText = attrString
    }
}
Run Code Online (Sandbox Code Playgroud)

将其复制到一个文件中,这样就可以像这样使用它

myLabel.setLineHeight(0.7)
Run Code Online (Sandbox Code Playgroud)


Kru*_*nal 28

从Interface Builder(Storyboard/XIB):

在此输入图像描述

编程方式:

SWift 4

使用标签扩展

extension UILabel {

    // Pass value for any one of both parameters and see result
    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 = "How to\ncontrol\nthe\nline spacing\nin UILabel"
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 = "How to\ncontrol\nthe\nline spacing\nin UILabel"
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)

  • 添加行“paragraphStyle.alignment = self.textAlignment”以保持原始对齐方式。否则,文本将左对齐。 (2认同)

Dre*_*ber 19

现在在iOS 6中有一个替代答案,即使用具有适当段落样式的NSAttributedString在标签上设置attributedText.有关NSAttributedString的行高详细信息,请参阅此堆栈溢出答案:

核心文本 - NSAttributedString线条高度做得对吗?


adr*_*nat 16

这是一个将UILabel子类化为line-height属性的类:https://github.com/LemonCake/MSLabel


Thy*_*ius 10

在Swift中,作为一个功能,受到DarkDust的启发

// Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20)
func setTextWithLineSpacing(label:UILabel,text:String,lineSpacing:CGFloat)
{
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = lineSpacing

    let attrString = NSMutableAttributedString(string: text)
    attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

    label.attributedText = attrString
}
Run Code Online (Sandbox Code Playgroud)


isa*_*ent 7

根据@Mike的回答,减少lineHeightMultiple是关键点.以下示例,它适用于我:

    NSString* text = label.text;
    CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: label.font}].width;
    if (textWidth > label.frame.size.width) {
        NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
        paragraph.alignment = NSTextAlignmentCenter;
        paragraph.lineSpacing = 1.0f;
        paragraph.lineHeightMultiple = 0.75;     // Reduce this value !!!
        NSMutableAttributedString* attrText = [[NSMutableAttributedString alloc] initWithString:text];
        [attrText addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, text.length)];
        label.attributedText = attrText;
    }
Run Code Online (Sandbox Code Playgroud)


Kev*_*bbe 5

SWIFT 3更有效地扩展了行间设置空间的有用扩展:)

extension UILabel
{
    func setLineHeight(lineHeight: CGFloat)
    {
        let text = self.text
        if let text = text 
        {

            let attributeString = NSMutableAttributedString(string: text)
            let style = NSMutableParagraphStyle()

           style.lineSpacing = lineHeight
           attributeString.addAttribute(NSParagraphStyleAttributeName,
                                        value: style,
                                        range: NSMakeRange(0, text.characters.count))

           self.attributedText = attributeString
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Jee*_*hut 5

我找到了一种方法,您可以设置真实的行高(不是一个因素),它甚至可以在 Interface Builder 中实时呈现。只需按照以下说明操作即可。代码是用Swift 4编写的。


第 1 步:创建一个名为的文件DesignableLabel.swift并插入以下代码:

import UIKit

@IBDesignable
class DesignableLabel: UILabel {
    @IBInspectable var lineHeight: CGFloat = 20 {
        didSet {
            let paragraphStyle = NSMutableParagraphStyle()
            paragraphStyle.minimumLineHeight = lineHeight
            paragraphStyle.maximumLineHeight = lineHeight
            paragraphStyle.alignment = self.textAlignment

            let attrString = NSMutableAttributedString(string: text!)
            attrString.addAttribute(NSAttributedStringKey.font, value: font, range: NSRange(location: 0, length: attrString.length))
            attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrString.length))
            attributedText = attrString
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第 2 步:将 aUILabel放入 Storyboard/XIB 并将其类设置为DesignableLabel. 等待您的项目构建(构建必须成功!)。

为 UILabel 指定类


第 3 步:现在您应该在属性窗格中看到一个名为“行高”的新属性。只需设置您喜欢的值,您应该立即看到结果!

在属性中设置行高