Выберите любой размер шрифта и измерьте размер текста.Разделите каждое из его измерений (ширину и высоту) на одно и то же измерение целевого прямоугольника, а затем разделите размер шрифта на больший коэффициент.
Обратите внимание, что текст будет измеряться в одной строке, так как не существует максимумаширина для этого, чтобы обернуть.Для длинной строки / строки это может привести к неоправданно маленькому размеру шрифта.Для текстового поля вы должны просто установить минимальный размер (например, небольшой размер системного шрифта) и установить режим усечения поля.Если вы намереваетесь обернуть текст, вам нужно измерить его чем-то, что принимает ограничивающий прямоугольник или размер.
Код, который задает вопрос, ориентировочно основан на этой идее:
-(float)scaleToAspectFit:(CGSize)source into:(CGSize)into padding:(float)padding
{
return MIN((into.width-padding) / source.width, (into.height-padding) / source.height);
}
-(NSFont*)fontSizedForAreaSize:(NSSize)size withString:(NSString*)string usingFont:(NSFont*)font;
{
NSFont* sampleFont = [NSFont fontWithDescriptor:font.fontDescriptor size:12.];//use standard size to prevent error accrual
CGSize sampleSize = [string sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:sampleFont, NSFontAttributeName, nil]];
float scale = [self scaleToAspectFit:sampleSize into:size padding:10];
return [NSFont fontWithDescriptor:font.fontDescriptor size:scale * sampleFont.pointSize];
}
-(void)windowDidResize:(NSNotification*)notification
{
text.font = [self fontSizedForAreaSize:text.frame.size withString:text.stringValue usingFont:text.font];
}