iOS UILabel自动收缩,因此单词不会截断为两行

规范制

我试图缩小UILabel,以使单词不会截断到下一行。不只是文本在文本区域的末尾被截断。

如果我有一个50x100的盒子,而我想在25.0pt的盒子里放上“ American”之类的东西,我最终会得到:

   50px
 -------
|Ameri- |
|can    |
|Beauty | 100px
|       |
 -------

在这种情况下,文本收缩似乎没有任何作用,因为它仍然适合UILabel框架。当文本很长时,例如“ Willie Wonka的Chocolate Factory”,它会很好地工作,但是我不希望单词被截断。

在这种情况下,这是理想的输出:

    50px
 --------
[American|
|Beauty  | 100px
|        |
|        |
|        |
 --------

任何建议将不胜感激!

编辑:解决方案

由于以下答案中的建议,这就是我最后要做的事情。效果很好!

- (CGFloat) calculateFromUILabel:(UILabel *)label
{
    NSString *stringToMeasure = label.text;
    NSLog(@"FontSizeMeasurement.calculateFromUILabel() %@", stringToMeasure);

    NSRange range = NSMakeRange(0, 1);
    NSAttributedString *attributedString = label.attributedText;
    NSDictionary *attributes = [attributedString attributesAtIndex:0 effectiveRange:&range];

    NSMutableCharacterSet *characterSet = [[NSCharacterSet whitespaceAndNewlineCharacterSet] mutableCopy];
    [characterSet addCharactersInString:@"-"];
    NSArray *words = [stringToMeasure componentsSeparatedByCharactersInSet:characterSet];

    CGSize maxSize = CGSizeZero;
    NSMutableAttributedString *maxWidthString = nil;
    for(int i = 0; i < words.count; i++) {
        NSString *word = words[i];
        CGSize wordSize = [word sizeWithAttributes:attributes];
        if(wordSize.width > maxSize.width) {
            maxSize = wordSize;
            maxWidthString = [[NSMutableAttributedString alloc] initWithString:word attributes:attributes];
        }
    }

    UIFont *font = [label.font copy];
    while(maxSize.width > self.maxWidth) {
        font = [font fontWithSize:(font.pointSize-0.1)];
        [maxWidthString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, maxWidthString.length)];
        maxSize = [maxWidthString size];
    }

    return font.pointSize;
}
汤米

我无法想到直接内置的任何内容。因此,我建议:

[NSCharacterSet +whitespaceAndNewlineCharacterSet]将字符串分割成多个分量[NSString -componentsSeparatedByCharactersInSet:]我考虑过推荐较高级别的人NSLinguisticTagger来弄清整个单词,但是那样的话就不允许出现带有冒号的单词。

在这些单词中,使用UIKit添加NSString -sizeWithAttributes:(在iOS 7下)或-sizeWithFont:(在6或以下)可以找到排印最大的单词您将假设当缩小字体大小时,最大字体将保持最大,我认为这将一直是正确的,因为Apple不会进行积极的字体提示。

如果该单词的宽度已经小于视图的宽度,那么您就完成了。只显示字符串。

否则,请使用快速二进制搜索,反复查询大小,直到找到您认为合适的精度范围内所需的较小字体大小(0.1的点对我来说是合理的,但您知道了)。然后以该大小显示整个字符串。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章