Масштабировать шрифт NSString до размера UIImage

Я пишу текст на изображение, снятое с камеры iDevice или выбранное из библиотеки фотографий, но мне нужно масштабировать размер шрифта в соответствии с шириной/высотой изображения. Вот мой текущий код: UIGraphicsBeginImageContext(img.size);

CGRect aRectangle = CGRectMake(0,0, img.size.width, img.size.height);
[img drawInRect:aRectangle];

[[UIColor whiteColor] set];           // set text color
NSInteger fontSize = 45;
UIFont *font = [UIFont systemFontOfSize:fontSize];// set text font

[ text drawInRect : aRectangle                      // render the text
         withFont : font
    lineBreakMode : UILineBreakModeTailTruncation  // clip overflow from end of last line
        alignment : UITextAlignmentCenter ];

UIImage *theImage=UIGraphicsGetImageFromCurrentImageContext();   // extract the image
UIGraphicsEndImageContext();     // clean  up the context.
return theImage;</i>

person Destiny Dawn    schedule 20.09.2012    source источник
comment
Вы хотите, чтобы текст был одной строкой или несколькими строками?   -  person Kent    schedule 20.09.2012
comment
Присоединяйтесь к чату fontScaling.   -  person Kent    schedule 20.09.2012
comment
@Kent Я получаю это сообщение: у вас должно быть 20 репутации в Stack Overflow, чтобы говорить здесь. См. FAQ. Я все еще новый участник.   -  person Destiny Dawn    schedule 20.09.2012
comment
Ах. облом. Итак, еще вопросы. Вы хотите, чтобы текст был на всю высоту изображения или есть какой-то другой предел?   -  person Kent    schedule 20.09.2012
comment
@Kent Что ж, я хочу, чтобы эта часть текста была похожа на центральный заголовок изображения. Как и для изображения с размерами 960x750, я бы установил размер шрифта на 45, чтобы он был прямо посередине и был достаточно большим, чтобы его можно было увидеть, но проблема в том, что я не могу сделать так, чтобы размер шрифта всегда был 45, так как размеры изображений отличаться.   -  person Destiny Dawn    schedule 20.09.2012


Ответы (1)


Вы хотите что-то вроде этого. Он создает прямоугольник размером в половину вашего изображения, а затем использует двоичный поиск для увеличения размера шрифта, который вы хотите.

//---- initial data
CGSize szMax = CGSizeMake(<imgWidth> / 2, <imgHeight> / 2);
CGFloat fMin = 2;      //-- the smallest size font we want
CGFloat fMax = 100;    //-- the largest size font we want
CGFloat fMid;          //-- the middle of min and max

while ((fMax - fMin) >= 1.0)    //-- repeat until the sizes converge
{
    fMid = (fMin + fMax) / 2.0;    //-- compute mid-point

    UIFont *pfnt = [UIFont systemFontOfSize: fMid];    //-- create middle-sized font

    //---- compute the size of the text using the mid-sized font
    CGSize szStr = [pStr sizeWithFont: pfnt constrainedToSize: szMax lineBreakMode: UILineBreakModeWordWrap];

    if (szStr.height > szMax.height)
        fMax = fMid;                //-- text too tall, set max to mid-point
    else               
        fMin = fMid;                //-- text too short, set min to mid-point
}
//---- 'fMid' is the size you want.
person Kent    schedule 20.09.2012
comment
Я пытаюсь реализовать код, но я немного запутался, как он работает, не могли бы вы объяснить это? Я очень новичок в Objective C, я программировал на .NET и C# последние 7 с лишним лет, поэтому настройка немного усложняется. - person Destiny Dawn; 20.09.2012
comment
Один вопрос, вопрос @Kent, я не уверен, что установить мой UIFont, я попробовал fMid и fMin, но текст находится по всему изображению. - person Destiny Dawn; 20.09.2012
comment
Смотрите последний комментарий. В конце цикла fMid должен быть нужного вам размера. Добавьте операторы NSLog, чтобы увидеть значения fMin, fMax и szStr в каждом цикле. Ты в Атле? - person Kent; 20.09.2012
comment
Вау, спасибо! Это очень помогло. :) У меня есть несколько проблем, я установил imgWidth и imgHeight на img.size.width и img.size.height, может ли это привести к тому, что текст закроет все изображение? Также я не уверен, что такое pStr и szMaxWidth. Я заменил pStr на свой NSString, но не уверен, что это сильно исправило. - person Destiny Dawn; 20.09.2012
comment
Ты в Атле? Обратите внимание, что мой код устанавливает szMax в <imgHeight> / 2. pStr — это ваша строка. - person Kent; 20.09.2012
comment
Это устранило эти проблемы, теперь я просто не уверен в szMaxWidth. Мне нужно изменить это на szMax? Я не знаком с Atl. - person Destiny Dawn; 20.09.2012