我试图缩小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] 删除。
我来说两句