更改UILabel中的段落高度(不是行间距)

时间:2015-05-31 12:43:29

标签: ios uilabel nsattributedstring

是否可以使用属性字符串限制\n\n中使用UILabel创建的段落之间的距离?

例如,我想这样: enter image description here

看起来像这样:

enter image description here

这会涉及用其他东西替换\ n \ n吗?或者使用NSAttributedString

有一个更简单的解决方案

3 个答案:

答案 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