Я думаю, вам просто нужно добавить это:
label.adjustsFontSizeToFitWidth = YES;
label.minimumFontSize = 0;
Тогда размер текста автоматически изменится в соответствии с меткой.
Обратите внимание, что это действительно будет работать, только если label.numberOfLines = 1, так что текст будет в одной строке.
Если вам нужно, чтобы текст был перенесен на несколько строк, но при этом уменьшился до нужного размера, решение будет более сложным. Для этого вам необходимо рассчитать размер отрисовки текста, а затем уменьшить его в цикле следующим образом:
NSString *theText = @"A long string";
CGRect labelRect = CGRectMake(10, 50, 300, 50);
label.adjustsFontSizeToFitWidth = NO;
label.numberOfLines = 0;
CGFloat fontSize = 30;
while (fontSize > 0.0)
{
CGSize size = [theText sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(labelRect.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];
if (size.height <= labelRect.size.height) break;
fontSize -= 1.0;
}
//set font size
label.font = [UIFont fontWithName:@"Verdana" size:fontSize];
Это в основном просто уменьшает размер шрифта, пока он не уместится на этикетке.
UPDATE:
Начиная с iOS7, многострочный текст также будет автоматически уменьшаться при adjustsFontSizeToFitWidth = YES
, поэтому вторая часть этого ответа больше не нужна (если только вы не поддерживаете iOS 6 и более ранние версии).