【问题标题】:UILineBreakModeWordWrap (or NSLineBreakByWordWrapping) stop from splitting word across 2 linesUILineBreakModeWordWrap(或 NSLineBreakByWordWrapping)停止将单词拆分为 2 行
【发布时间】:2013-06-03 05:59:12
【问题描述】:

我正在尝试计算适合定义矩形的字符串的最大字体大小。现在我发现了许多其他说明如何做到这一点的帖子,包括:

Resizing UILabel to fit with Word Wrap

Resize CATextLayer to fit text on iOS

iPhone UILabel sizeWithFont:

Which characters does NSLineBreakByWordWrapping break on?

现在这些很棒,告诉我如何获得最大的字体大小。但是,当使用“sizeWithFont:constrainedToSize:lineBreakMode:”方法和换行符(UILineBreakModeWordWrap 或 NSLineBreakByWordWrapping)时,实际上是将大字拆分为多行。

UILineBreakModeWordWrap(或 NSLineBreakByWordWrapping)不应该意味着单词不会“拆分”超过一行。我很高兴多个单词出现在多行中,但我不不希望一个词被分成两个。如果 UILineBreakModeWordWrap 不能做到这一点,那还有什么可以做到的吗?

下面是我用来确定最大可能字体大小的代码:(文本为@"australia")

-(UIFont *)GetFontSizeForText:(NSString *)text inRect:(CGRect)rect {
    BOOL notFit = YES;
    CGSize textSize;
    CGFloat tmpFontSize = TEMPLATE_DEFAULT_FONT_SIZE;
    UIFont *tmpFont;    

    CGSize maxSize = CGSizeMake(rect.size.width, MAXFLOAT);

    while (notFit) {
        tmpFont = [UIFont fontWithName:TEMPLATE_DEFAULT_FONT_NAME size:tmpFontSize];
        textSize = [text sizeWithFont:tmpFont constrainedToSize:maxSize lineBreakMode:UILineBreakModeWordWrap];

        if (textSize.height > rect.size.height) {
            tmpFontSize -= 1.0;
            if (tmpFontSize < 2.0) {
                break;
            }
        } else {
            notFit = NO;
        }
    }

    return tmpFont;
}

下面是一个图片链接,显示了使用上述函数计算字体大小时会发生什么。 “黄色”框是最大的尺寸。紫色框是使用计算出的字体大小渲染的实际 CATextLayer。这些框上方的“AUSTRALIA”文本是一个UILabel,我用相同的字体大小在界面生成器上放了它。

http://www.connstructstudios.com.au/externalimages/multilines.png

【问题讨论】:

  • 你想用什么 UI 组件来实现这个目标?
  • 这看起来不像是一个常见的情况(一个标签太窄以至于几乎不能在一行中放一个小字)。您应该使标签足够宽以容纳给定字体大小中最长的单词,那么您将没有问题。实际上,您应该让它足够长以容纳多个单词!当然,如果单行没有足够的空间容纳一个单词,它会自动换行。你还期望它做什么?
  • 大家好,我正在使用它来生成 CATextLayer 并将其放到屏幕上。因此,为了回应您的陈述,我只是将其用作示例。但是,该框是一个 128 x 128 的矩形,足以容纳文本“澳大利亚”。它只需要字体大小为 22 像素或更低(代码停止在字体大小 44 像素处)。由于文本是动态的(用户可以在其他地方输入),我需要能够显示他们的文本(文本越多,就会缩小)。
  • 更多信息。图片中的黄色框是一个 CALayer(它定义了文本可以进入的最大矩形空间)。紫色框和相关文本是 CATextLayer,其大小由我上面列出的函数确定。
  • 固定宽度会更好。缩小它有什么意义?如果你让它有一个足够长的固定宽度来包含最长的单词,那么你永远不会遇到这个问题。

标签: ios nsstring uifont


【解决方案1】:

“换行发生在单词边界处,除非单词本身不适合一行。”

所以,如果单个单词太长,可以拆分。

要解决这个问题,你可以用单词分隔字符串,对每个组件使用- (CGSize)sizeWithFont:(UIFont *)font;,并检查宽度是否小于最大值。

【讨论】:

  • 谢谢 Luis,有时间我会试试的。我想我会做的是我会抓住最大的文本,然后循环直到我找到一个足够大的字体大小让它可以放在一行上。然后从那里开始整个文本循环(从之前发现的字体大小开始)并从那里开始。感谢您的帮助!
  • 谢谢 Luis,我现在对文本中最长的单词进行子检查。这为我提供了起始字体,然后我将继续将其用于整个文本。 ;)
  • 很高兴知道。获得最长单词的起始字体似乎是一个非常理想的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多