是否可以使用属性字符串限制\n\n
中使用UILabel
创建的段落之间的距离?
例如,我想这样:
看起来像这样:
这会涉及用其他东西替换\ n \ n吗?或者使用NSAttributedString
?
答案 0 :(得分:1)
首先:使用\n\n
来创建两段之间的距离根本不是一个好主意。 \n
具有新段落的语义含义,因此您有三个段落,其中两个段落在语义上。这就像一个业余秘书处理段落距离。您应该用一个\n
替换它们。
但是,您不应使用字体大小来调整行间距或段落间距。这高度依赖于字体的形状及其定义。事情快速发展。
添加段落样式,因为它们是为段落间距构建的。设置行高或段落间距属性。
答案 1 :(得分:0)
我在评论中概述的解决方案有效。您可以将空行/段落间距的字体大小设置为令您高兴的东西:
[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);
}
答案 2 :(得分:-1)
我在这个问题中没有提到的一件事,我认为这个例子很明显,描述不在我的控制范围内,而是由用户生成。因此,在创建文本时,它们会添加回车符。
所以我提出的解决方案如下:
首先,我用一个回车替换任何\ n \ n个字符。这是受到amin-negm-awad的回答的启发。 \ n \ n不是生成段落空间的理想方法。
我使用以下代码执行此操作:
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