Опитвам се да накарам UILabel да се свие, така че думите да не се съкращават до следващия ред. Не само отрязване на текст в края на текстовата област.
Ако имам кутия с размери 50x100 и искам да сложа нещо като "American" в кутията на 25.0pt, в крайна сметка получавам:
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;
}