Недавно мне пришлось самому создать для этого метод, вот этот код, который я придумал
-(float)updateFontSize : (UITextField *)textField : (int)targetLabelWidth : (int)targetLabelHeight
{
//Current Label Size
CGSize size = [textField.text sizeWithFont:textField.font];
//Size label should be limited to
CGSize targetSize = CGSizeMake(targetLabelWidth , targetLabelHeight);
//Current FontSize
int fontSize = textField.font.pointSize;
if(size.height > targetSize.height)
{
while(size.height > targetSize.height)
{
//Create new font
UIFont *newFont = textField.font;
//Decrement font size
fontSize-=1;
//Set new font size
newFont = [newFont fontWithSize:fontSize];
//set new label size
size = [textField.text sizeWithFont:newFont];
}
}
if(size.height < targetSize.height)
{
while(size.height < targetSize.height)
{
//Create new font
UIFont *newFont = textField.font;
//Increment font size
fontSize+=1;
//Set new font size
newFont = [newFont fontWithSize:fontSize];
//set new label size
size = [textField.text sizeWithFont:newFont];
}
}
//Prevent fontsize ever being 0
if(fontSize == 0)
{
fontSize = 1;
}
return fontSize;
}
Я сделал быстрый класс, чтобы проверить это. Вы можете поиграть с высотой, и она соответственно изменит свой размер.
int height = 10;
UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(10, 50, 200, height)];
field.borderStyle = UITextBorderStyleRoundedRect;
field.textAlignment = NSTextAlignmentLeft;
field.text = @"testing";
float size = [self updateFontSize:field :200 :height];
field.font = [UIFont fontWithName:@"Arial" size:size];
[self.view addSubview:field];
Изменить: обновлено
Когда я создал этот код, он изначально был создан при установке ширины и высоты метки, чтобы я мог изменить размер метки, чтобы она могла поместиться в контейнере. Я быстро переадаптировал для TextField, но должно работать нормально
Прежде чем я смогу изменить его размер, я должен выяснить текущую ширину/высоту текста, содержащегося в текстовом поле. Теперь в моем методе я знал, какими должны быть ширина и высота, однако вам нужен такой метод
Итак, у нас есть новый метод
-(float)getFontSizeToFit:(NSTextField*)aTextField theMultilineTextToFitIn:(NSString*)aString
{
}
Хорошо, давайте с этим. Обратите внимание, что я не на Mac, поэтому я делаю эту короткую руку
Итак, у вас есть текстовое поле с таким текстом
«Привет, это какой-то случайный текст»
Итак, вы звоните
CGSize size = [textField.text sizeWithFont:textField.font];
Это создает объект размера, который содержит как ширину, так и высоту текста, прежде чем делать какие-либо разрывы строк или что-то в этом роде.
Итак, допустим, ширина и высота текста были W = 200, H = 30, и допустим, textField имеет только ширину 150, высоту 50, и нам нужно, чтобы текст помещался здесь. Итак, у нас есть
Width = 200
Height = 30
textFieldWidth = 150
textFieldHeight = 50
я могу просто сделать
NumberOfLines = Width /textFieldWidth .
Если это значение равно ‹ 1, то я знаю, что текст будет помещаться в текстовое поле, однако, если оно больше 1, я знаю, что он не поместится в текстовое поле и, следовательно, необходимо изменить его размер. В приведенном выше примере это будет 200/150 = 1,333. Я всегда увеличиваю это значение, поэтому я бы округлил его до 2. Поэтому я знаю, что мне нужно как минимум 2 строки, чтобы эта метка поместилась внутри контейнера. Я знаю высоту метки, которая в приведенном выше примере была 30, поэтому я
Высота * КоличествоЛиний = КоличествоНеобходимыхЛиний 30 * 2 = 60
Однако, если вы посмотрите выше, высота textField была всего 50. Это означает, что размер объекта необходимо изменить. Итак, давайте пробежимся по методу с указанными выше переменными.
CGSize size = [textField.text sizeWithFont:textField.font];
Это создает объект размера (200,30)
Однако само TextField только (150,60)
Теперь мы можем изменить стиль текста на перенос слов, поэтому текст будет разделен на 2 строки, однако проблема в том, что высота текста будет больше, чем высота текстового поля. Поэтому нам нужно начать уменьшать размер шрифта, пока общая высота двух строк текста не станет меньше 60.
Здесь вступает в действие цикл while. Отсюда вы можете использовать цикл while, чтобы постоянно уменьшать размер шрифта на 1 текста, а затем выполнять вышеуказанные вычисления и продолжать делать это до тех пор, пока текст не уместится в самом текстовом поле.
Как я упоминал ранее, у меня нет Mac, поэтому я не могу создать этот метод для вас. Но, надеюсь, используя описанную выше логику, вы сможете создать что-то подобное самостоятельно.
Удачи, Надеюсь это поможет!!
person
AdamM
schedule
27.06.2013