在 UILabel 中更改段落高度(不是行间距)
Change paragraph height (not line spacing) in a UILabel
是否可以使用属性字符串在 UILabel
中限制使用 \n\n
创建的段落之间的距离更小?
例如,我想要这样:
看起来像这样:
这是否涉及将 \n\n 替换为其他内容?或者是否有使用 NSAttributedString
的更简单的解决方案?
我在评论中概述的解决方案有效。您可以将空行/段落间距的字体大小设置为您喜欢的大小:
[myAttributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:5.0] range:NSMakeRange(6, 1)];
以下代码查找所有出现的 \n\n
并指定第二个具有特定大小:
unsigned long length = myAttributedString.length;
NSRange range = NSMakeRange(0, length);
NSRange found;
while (NSNotFound != (found =[myAttributedString.string rangeOfString:@"\n\n" options:0 range:range]).location) {
[myAttributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:8.0] range:NSMakeRange(found.location + 1, 1)];
range = NSMakeRange(found.location + 2, length - found.location - 2);
}
首先:使用 \n\n
在两个段落之间创建距离根本不是一个好主意。 \n
具有新段落的语义含义,因此您有三个段落,其中两个具有语义含义。这就像一个业余秘书处理段落距离。您应该将它们替换为单个 \n
.
但是,您不应使用字体大小来调整行间距或段落间距。这高度依赖于字体的形状及其定义。事情很快就坏了。
添加段落样式,因为它们是为段落间距构建的。设置行高或段落间距属性。
我在问题中没有提到的一件事,我认为从示例中可以明显看出,描述不在我的控制范围内,它是由用户生成的。因此,回车return字符是他们在创建文本时添加的。
所以我想到的解决方案如下:
首先,我将任何 \n\n 个字符替换为单个回车符 return。这是受到 amin-negm-awad 的回答的启发。 \n\n 不是生成段落 space.
的理想方式
我正在使用以下代码段执行此操作:
func sanitize() -> String {
var output = NSMutableString(string: self)
var numberOfReplacements = 0
do {
let range = NSMakeRange(0, output.length)
numberOfReplacements = newString.replaceOccurrencesOfString("\n\n", withString: "\n", options: NSStringCompareOptions.CaseInsensitiveSearch, range: range)
} while (numberOfReplacements > 0)
return output as String
}
下一部分是应用带有属性字符串的段落样式。这是一个相当灵活的示例函数:
func textAttributesWithFont(font: UIFont, andColor color: UIColor,
lineSpacing: CGFloat = 0,
maximumLineHeight: CGFloat = 0,
textAlignment: NSTextAlignment = .Natural) -> [NSObject: AnyObject] {
var attributes = [NSFontAttributeName : font, NSForegroundColorAttributeName : color]
var paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lineSpacing
paragraphStyle.alignment = textAlignment
paragraphStyle.maximumLineHeight = maximumLineHeight
paragraphStyle.paragraphSpacing = 4
attributes[NSParagraphStyleAttributeName] = paragraphStyle
return attributes
}
最后使用属性构造标签:
var label1 = UILabel()
let text1 = "This is a test that is supposed to wrap with some paragaphs\n\nThis is a paragraph"
label1.attributedText = NSAttributedString(string:sanitizeComment(text1), attributes: attributes)
label1.numberOfLines = 0
是否可以使用属性字符串在 UILabel
中限制使用 \n\n
创建的段落之间的距离更小?
例如,我想要这样:
看起来像这样:
这是否涉及将 \n\n 替换为其他内容?或者是否有使用 NSAttributedString
的更简单的解决方案?
我在评论中概述的解决方案有效。您可以将空行/段落间距的字体大小设置为您喜欢的大小:
[myAttributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:5.0] range:NSMakeRange(6, 1)];
以下代码查找所有出现的 \n\n
并指定第二个具有特定大小:
unsigned long length = myAttributedString.length;
NSRange range = NSMakeRange(0, length);
NSRange found;
while (NSNotFound != (found =[myAttributedString.string rangeOfString:@"\n\n" options:0 range:range]).location) {
[myAttributedString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:8.0] range:NSMakeRange(found.location + 1, 1)];
range = NSMakeRange(found.location + 2, length - found.location - 2);
}
首先:使用 \n\n
在两个段落之间创建距离根本不是一个好主意。 \n
具有新段落的语义含义,因此您有三个段落,其中两个具有语义含义。这就像一个业余秘书处理段落距离。您应该将它们替换为单个 \n
.
但是,您不应使用字体大小来调整行间距或段落间距。这高度依赖于字体的形状及其定义。事情很快就坏了。
添加段落样式,因为它们是为段落间距构建的。设置行高或段落间距属性。
我在问题中没有提到的一件事,我认为从示例中可以明显看出,描述不在我的控制范围内,它是由用户生成的。因此,回车return字符是他们在创建文本时添加的。
所以我想到的解决方案如下:
首先,我将任何 \n\n 个字符替换为单个回车符 return。这是受到 amin-negm-awad 的回答的启发。 \n\n 不是生成段落 space.
的理想方式我正在使用以下代码段执行此操作:
func sanitize() -> String {
var output = NSMutableString(string: self)
var numberOfReplacements = 0
do {
let range = NSMakeRange(0, output.length)
numberOfReplacements = newString.replaceOccurrencesOfString("\n\n", withString: "\n", options: NSStringCompareOptions.CaseInsensitiveSearch, range: range)
} while (numberOfReplacements > 0)
return output as String
}
下一部分是应用带有属性字符串的段落样式。这是一个相当灵活的示例函数:
func textAttributesWithFont(font: UIFont, andColor color: UIColor,
lineSpacing: CGFloat = 0,
maximumLineHeight: CGFloat = 0,
textAlignment: NSTextAlignment = .Natural) -> [NSObject: AnyObject] {
var attributes = [NSFontAttributeName : font, NSForegroundColorAttributeName : color]
var paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lineSpacing
paragraphStyle.alignment = textAlignment
paragraphStyle.maximumLineHeight = maximumLineHeight
paragraphStyle.paragraphSpacing = 4
attributes[NSParagraphStyleAttributeName] = paragraphStyle
return attributes
}
最后使用属性构造标签:
var label1 = UILabel()
let text1 = "This is a test that is supposed to wrap with some paragaphs\n\nThis is a paragraph"
label1.attributedText = NSAttributedString(string:sanitizeComment(text1), attributes: attributes)
label1.numberOfLines = 0