Я пытаюсь уменьшить UILabel, чтобы слова не усекались до следующей строки. Не просто обрезание текста в конце текстовой области.
Если у меня есть поле размером 50x100, и я хочу вставить что-то вроде «американский» в поле размером 25,0 pt, я в итоге получаю:
50px
-------
|Ameri- |
|can |
|Beauty | 100px
| |
-------
Сокращение текста, кажется, ничего не делает в этой ситуации, поскольку он все еще помещается во фрейме UILabel. Это работает очень хорошо, когда текст очень длинный, как «Шоколадная фабрика Вилли Вонки», но я не хочу усечения слов.
Это идеальный результат в этом сценарии:
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;
}