在 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