【问题标题】:Prevent line break in a NSAttributedString防止在 NSAttributedString 中换行
【发布时间】:2016-02-19 03:38:03
【问题描述】:

我认为当您有一组不想要换行符的单词时,这是一个常见问题。

有时这些词之间的字符是空格或连字符等。在我的情况下,它是一个点:)

这是我的文字50.0/80.0

最后,我使用尺寸标签并测量了该字符串需要多少空间:

UIFont *fontAwardNumber = [UIFont fontWithName:@"DIN-Bold" size:20];

NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
CGSize labelSize = (CGSize){customCell.awardValueLabel.bounds.size.width, FLT_MAX};
CGRect rectNeededForAwardNumber = [awardNumber boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: fontAwardNumber} context:context];
if (rectNeededForAwardNumber.size.height > customCell.awardValueLabel.bounds.size.height) {
    //We need to add a breakline
    NSRange range = [awardNumber rangeOfString:@"/"];
    if (range.location != NSNotFound) {
        awardNumber = [awardNumber stringByReplacingCharactersInRange:range withString:@"/\n"];
    }
}

我找到了其他解决方案,例如将空格或连字符替换为牢不可破的字符:

Preventing line breaks in part of an NSAttributedString

但我的问题更笼统,NSAttributedString 是否提供了一些东西来将一组单词定义为不可破坏的?或者有没有更简单的方法来处理一组通用的单词?

【问题讨论】:

  • 使用NSParagraphStyle,将换行模式设置为ByWordWrapping,看到这个答案...stackoverflow.com/a/19197903/499581
  • 换行符使用 \,而不是 /。你知道的,对吧?

标签: ios nsattributedstring


【解决方案1】:

不,NSAttributedString 没有任何每个字符的属性来防止在一个范围内换行。您可以将NSLineBreakMode 设置为ByClippingNSParagraphStyle 中的其他非换行模式,但这适用于段落中的所有文本。 (段落用换行符分隔。)

为防止在比整个段落更小的范围内换行,您需要在可能发生不需要的换行的任意两个字符之间插入U+2060 WORD JOINER。在您的示例中,这意味着在斜杠字符的每一侧。

【讨论】:

  • 我猜你的意思是在点字符的每一侧,即我不想破坏的字符。我试过替换最后一个“。”对于 U+2060.U+2060,它不起作用。即使我尝试在完整数字之间添加这些字符:U+2060 50.0/80.0 U+2060 但什么也没有。 AwardNumber = [NSString stringWithFormat:@"%@%@%@",@"\u2060",awardNumber,@"\u2060"];
  • 我还添加了段落: NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; [样式 setLineBreakMode:NSLineBreakByWordWrapping]; ' NSDictionary *attributes = @{NSFontAttributeName: fontAwardNumber, NSParagraphStyleAttributeName: style}; NSMutableAttributedString *attributedStringAwardNumber = [[NSMutableAttributedString alloc] initWithString:awardNumber attributes:attributes];
猜你喜欢
  • 2018-04-28
  • 2010-10-21
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
相关资源
最近更新 更多