如何控制UILabel中的行距
当在 UILabel
中放入多行时,是否可以减少文本之间的间隙?我们可以设置框架、字体大小和行数。我想减少该标签中两条线之间的间隙。
Is it possible to reduce the gap between text, when put in multiple lines in a UILabel
? We can set the frame, font size and number of lines. I want to reduce the gap between the two lines in that label.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(21)
在 Xcode 6 中,您可以在情节提要中执行此操作:
In Xcode 6 you can do this in the storyboard:
我考虑过在这个答案中添加一些新内容,所以我感觉没那么糟糕...这是一个 Swift 答案:
“简短回答:你不能。要更改间距在文本行之间,您必须子类化 UILabel 并滚动您自己的 drawTextInRect,或创建多个标签。”请参阅:设置 UILabel 行距
这是一个非常古老的答案,其他人已经添加了新的更好的方法来处理这个问题..请参阅下面提供的最新答案。I thought about adding something new to this answer, so I don't feel as bad... Here is a Swift answer:
"Short answer: you can't. To change the spacing between lines of text, you will have to subclass UILabel and roll your own drawTextInRect, or create multiple labels."See: Set UILabel line spacing
This is a really old answer, and other have already addded the new and better way to handle this.. Please see the up to date answers provided below.从 iOS 6 开始,您可以为 UILabel 设置属性字符串。检查以下内容:
Starting from iOS 6 you can set an attributed string to the UILabel. Check the following :
这里所说的解决方案对我来说不起作用。我发现使用 iOS 6 NSAttributeString 的方法略有不同:
The solutions stated here didn't work for me. I found a slightly different way to do it with the iOS 6 NSAttributeString:
从 Interface Builder (Storyboard/XIB):
以编程方式:< /strong>
SWift 4
使用标签扩展
现在调用扩展函数
或使用标签实例(只需复制并执行此代码即可查看结果)
Swift 3
From Interface Builder (Storyboard/XIB):
Programmatically:
SWift 4
Using label extension
Now call extension function
Or using label instance (Just copy & execute this code to see result)
Swift 3
我制作了这个对我来说非常有效的简单扩展:
将其复制到文件中,然后您可以像这样使用它
I've made this simple extension that works very well for me:
Copy this in a file, so then you can use it like this
现在,iOS 6 中有一个替代答案,即使用具有适当段落样式的 NSAttributedString 在标签上设置 attributeText。有关 NSAttributedString 行高的详细信息,请参阅此堆栈溢出答案:
Core Text - NSAttributedString line高度正确吗?
There's an alternative answer now in iOS 6, which is to set attributedText on the label, using an NSAttributedString with the appropriate paragraph styles. See this stack overflow answer for details on line height with NSAttributedString:
Core Text - NSAttributedString line height done right?
这是一个将 UILabel 子类化为具有 line-height 属性的类: https://github.com/LemonCake/MSLabel
Here is a class that subclass UILabel to have line-height property : https://github.com/LemonCake/MSLabel
在 Swift 中作为一个函数,受到 DarkDust 的启发
In Swift and as a function, inspired by DarkDust
根据@Mike的回答,减少
lineHeightMultiple
是关键点。下面的例子,它对我来说效果很好:According @Mike 's Answer, reducing the
lineHeightMultiple
is the key point. Example below, it work well for me:SWIFT 3 有用的扩展,可以更轻松地设置线路之间的空间:)
SWIFT 3 useful extension for set space between lines more easily :)
我找到了一种方法,您可以设置实际行高(不是一个因素),甚至可以在 Interface Builder 中实时呈现。只需按照以下说明操作即可。代码是用 Swift 4 编写的。
步骤 #1: 创建一个名为
DesignableLabel.swift
的文件并插入以下代码:步骤 #2: 放置一个
UILabel 到 Storyboard/XIB 中,并将其类设置为 DesignableLabel。等待您的项目构建(构建必须成功!)。
第 3 步: 现在您应该在属性窗格中看到一个名为“Line Height”的新属性。只需设置您喜欢的值,您应该立即看到结果!
I've found a way where you can set the real line height (not a factor) and it even renders live in Interface Builder. Just follow the instructions below. Code is written in Swift 4.
Step #1: Create a file named
DesignableLabel.swift
and insert the following code:Step #2: Place a
UILabel
into a Storyboard/XIB and set its class toDesignableLabel
. Wait for your project to build (build must succeed!).Step 3: Now you should see a new property in the properties pane named "Line Height". Just set the value you like and you should see the results immediately!
这是 UILabel 的一个子类,它设置 lineHeightMultiple 并确保固有高度足够大,不会截断文本。
Here is a subclass of UILabel that sets
lineHeightMultiple
and makes sure the intrinsic height is large enough to not cut off text.斯威夫特 3 扩展:
Swift 3 extension:
在 Swift 2.0 中...
添加扩展:
现在,只需将 UILabel 设置为 attributeText:
显然,我添加了一堆您可能不需要的参数。尝试一下——随意重写这个方法——我在一堆不同的答案中寻找这个,所以我想我会发布整个扩展,以防它对那里的人有帮助......-rab
In Swift 2.0...
Add an extension:
Now, just set your UILabel as attributedText:
Obviously, I added a bunch of parameters that you may not need. Play around -- feel free to rewrite the method -- I was looking for this on a bunch of different answers so figured I'd post the whole extension in case it helps someone out there... -rab
Swift3 - 在 UITextView 或 UILabel 扩展中,添加此函数:
如果您已经在视图中使用属性字符串(而不是覆盖它们),我添加了一些代码来保留当前属性文本。
Swift3 - In a UITextView or UILabel extension, add this function:
I added some code to keep the current attributed text if you are already using attributed strings with the view (instead of overwriting them).
另一个答案...如果您以编程方式传递字符串,则需要传递属性字符串而不是常规字符串并更改其样式。(iOS10)
Another answer... If you're passing the string programmatically, you need to pass a attributed string instead a regular string and change it's style.(iOS10)
这应该会有所帮助。然后,您可以将标签分配给故事板中的这个自定义类,并直接在属性中使用它的参数:
This should help with it. You can then assign your label to this custom class within the storyboard and use it's parameters directly within the properties:
Swift 4 标签扩展。在传递给函数之前创建 NSMutableAttributedString,以防属性文本需要额外的属性。
Swift 4 label extension. Creating NSMutableAttributedString before passing into function in case there are extra attributes required for the attributed text.
这段代码对我有用(当然是 ios 7 和 ios 8)。
This code worked for me (ios 7 & ios 8 for sure).
这是我的快速解决方案。该子类应该适用于 attributeText 和 text 属性以及 characterSpacing + lineSpacing。如果设置了新字符串或 attributeString,它会保留间距。
Here is my solution in swift. The subclass should work for both attributedText and text property and for characterSpacing + lineSpacing. It retains the spacing if a new string or attributedString is set.