【发布时间】:2013-06-03 05:59:12
【问题描述】:
我正在尝试计算适合定义矩形的字符串的最大字体大小。现在我发现了许多其他说明如何做到这一点的帖子,包括:
Resizing UILabel to fit with Word Wrap
Resize CATextLayer to fit text on iOS
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,其大小由我上面列出的函数确定。
-
固定宽度会更好。缩小它有什么意义?如果你让它有一个足够长的固定宽度来包含最长的单词,那么你永远不会遇到这个问题。