Используйте sizeToFit UILabel вместо sizeWithFont: для разметки многострочного UILabel, поскольку sizeWithFont: будет обрезать строку (см. Документацию Apple). Следующий код уменьшает размер шрифта надписи до тех пор, пока текст не уместится в указанный размер ... будет использовано несколько строк текста, как только они уместятся в указанную высоту:
-(void)setFontSizeOfMultiLineLabel: (UILabel*)label
toFitSize: (CGSize) size
forMaxFontSize: (CGFloat) maxFontSize
andMinFontSize: (CGFloat) minFontSize
startCharacterWrapAtSize: (CGFloat)characterWrapSize{
CGRect constraintSize = CGRectMake(0, 0, size.width, 0);
label.frame = constraintSize;
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0; // allow any number of lines
for (int i = maxFontSize; i > minFontSize; i--) {
if((i < characterWrapSize) && (label.lineBreakMode == UILineBreakModeWordWrap)){
// start over again with lineBreakeMode set to character wrap
i = maxFontSize;
label.lineBreakMode = UILineBreakModeCharacterWrap;
}
label.font = [label.font fontWithSize:i];
[label sizeToFit];
if(label.frame.size.height < size.height){
break;
}
label.frame = constraintSize;
}
}
Назовите это ярлыком с вашим любимым текстом и шрифтом:
UILabel *label = [[UILabel alloc] initWithFrame: CGRectZero];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.text = text;
label.font = [UIFont fontWithName: @"Helvetica" size: 16];
[self setFontSizeOfMultiLineLabel: label toFitSize: CGSizeMake(200, 44) forMaxFontSize: 16 andMinFontSize: 8 startCharacterWrapAtSize: 11];
Параметр startCharacterWrapAtSize позволяет вам выбрать использование CharacterWrap, начиная с заданного размера шрифта. Это должно сэкономить место в случае, если WordWrap будет использовать действительно маленькие шрифты.
редактировать: исправление