是否有可能减少文本之间的差距,当把在一个UILabel多行?我们可以设置框架,字体大小和行数。我想减少标签中两行之间的差距。
当前回答
在Xcode 6中,你可以在storyboard中这样做:
其他回答
我想在这个答案中加入一些新的东西,这样我就不会感觉那么糟糕了……以下是斯威夫特的回答:
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
简单的回答是:你不能。要改变文本行间的间距,你必须继承UILabel并滚动自己的drawTextInRect,或者创建多个标签。”
参见:设置UILabel行间距
这是一个非常老的答案,其他人已经添加了新的更好的方法来处理这个问题。请参阅下面提供的最新答案。
我找到了一种方法,你可以设置真实的行高(不是一个因素),它甚至在界面生成器中渲染。按照下面的说明做就可以了。代码是用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
}
}
}
步骤#2:将UILabel放入Storyboard/XIB中,并将其类设置为DesignableLabel。等待项目构建完成(构建必须成功!)。
步骤3:现在你应该在属性窗格中看到一个名为“Line Height”的新属性。只需设置您喜欢的值,您应该立即看到结果!
从ios6开始,你可以为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;
下面是UILabel的一个子类,它设置lineHeightMultiple并确保内在高度足够大,不会截断文本。
@IBDesignable
class Label: UILabel {
override var intrinsicContentSize: CGSize {
var size = super.intrinsicContentSize
let padding = (1.0 - lineHeightMultiple) * font.pointSize
size.height += padding
return size
}
override var text: String? {
didSet {
updateAttributedText()
}
}
@IBInspectable var lineHeightMultiple: CGFloat = 1.0 {
didSet {
updateAttributedText()
}
}
private func updateAttributedText() {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = lineHeightMultiple
attributedText = NSAttributedString(string: text ?? "", attributes: [
.font: font,
.paragraphStyle: paragraphStyle,
.foregroundColor: textColor
])
invalidateIntrinsicContentSize()
}
}
在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
}