防止部分NSAttributedString中的换行符

时间:2014-08-19 21:25:17

标签: ios nsattributedstring

我正在制作UILabel,其中包含大型主要文字,后跟较小的文字,告诉您是谁说的:

Screenshot showing problem

现在它基本上是一个NSAttributedString,在小文本上有一个font属性。

我想设置一下,所以大文字包装但小文本没有。也就是说,如果文本将与正确的项目中的所有内容相同,则它应该按原样呈现,但是它会像在左侧项目中一样包裹,整个小文本应该出现在下一行:

Screenshot showing correct behavior

我想要实现的HTML等同于:

Title <nobr>Subtitle</nobr>
- or -
Title <span style="white-space:nowrap">Subtitle</span>

我尝试使用NSHTMLTextDocumentType将这两者转换为NSAttributedStrings,但似乎没有直接翻译。

3 个答案:

答案 0 :(得分:24)

根据rmaddy的建议,我可以通过用不破坏的替代方案替换空格和破折号来获得我想要的效果:

目标-C:

NS_INLINE NSString *NOBR(NSString *string) {
return [[string stringByReplacingOccurrencesOfString:@" " withString:@"\u00a0"] 
                stringByReplacingOccurrencesOfString:@"-" withString:@"\u2011"];

}

NSAttributedString *username = [[NSAttributedString alloc] 
    initWithString:NOBR(hotQuestion.username) attributes:nil];
...

Swift(注意稍有不同的转义码格式):

func nobr(_ string:String) -> String {
    return string
        .stringByReplacingOccurrencesOfString(" ", withString: "\u{a0}")
        .stringByReplacingOccurrencesOfString("-", withString: "\u{2011}")
}

let username = NSAttributedString(string:nobr(hotQuestion.username, attributes:nil))

答案 1 :(得分:12)

Unicode中还有word-joiner \ u2060字符,它可以防止任何一方的换行而且是不可见的。当程度符号是单词的一部分时,我用它强制自动换行,所以在iOS中整个单词将保持在同一行。

目标-C:

text = [text stringByReplacingOccurrencesOfString:@"°" withString:@"\u2060°\u2060"];

答案 2 :(得分:1)

@ brian-nickel在Swift 5.1和String扩展中的出色解决方案

extension String {
    var withoutLineBreak: String {
        self.replacingOccurrences(of: " ", with: "\u{a0}")
            .replacingOccurrences(of: "-", with: "\u{2011}")
    }
}