динамически изменять размер шрифта NSTextfield

Я хочу изменить размер шрифта моего текстового поля в зависимости от высоты моего текстового поля.

Потому что у меня есть код, который определяет размер моего интерфейса в зависимости от размера экрана (разрешения экрана) и когда я установил самое низкое разрешение.

Текст немного обрезан, что делает его нечитаемым.

Как я могу динамически изменить размер шрифта. Текстовое поле имеет фиксированную высоту и ширину.

Я для приложения OSX, поэтому я не могу использовать настройку размера шрифта, как в iOS.


person killerwakka    schedule 27.06.2013    source источник
comment
Вы говорите, что я хочу изменить размер шрифта моего текстового поля в зависимости от высоты моего текстового поля. Вы также говорите, что текстовое поле имеет фиксированную высоту и ширину. Что вы хотите сделать, не ясно.   -  person El Tomato    schedule 27.06.2013
comment
Я думаю, что OP означает, что будет несколько разных текстовых полей, и каждое из них будет иметь разную фиксированную ширину/высоту, поэтому размер текста должен быть скорректирован соответствующим образом для каждого текстового поля. Ответ, который я предоставил, должен динамически регулировать размер шрифта, надеюсь, это поможет!   -  person AdamM    schedule 27.06.2013


Ответы (1)


Недавно мне пришлось самому создать для этого метод, вот этот код, который я придумал

-(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
comment
Извините, но я не понимаю этот код. Во-первых, объявление метода кажется неправильным (или это особый способ написания объявления?). И я не понимаю, что такое currentLabelWidth и currentLabelHeight. Ширина и высота какой этикетки? Если я хорошо понимаю вопрос, мы хотим адаптировать размер шрифта в соответствии с шириной и высотой текстового поля. Параметрами метода должны быть только NSTextField и NSString строки, которую мы хотим поместить в NSTextField? Я был бы признателен, если бы вы могли уточнить. - person Regis_AG; 20.09.2013
comment
Я обновил там метод, переименовав переменные для ясности. В основном вы передаете targetWidth и targetHeight, которые вы хотите, чтобы размер текстового поля был. Объект Size создается из этих двух переменных. Объект размера также создается из текущего размера текста объекта TextField, который вы хотите обновить. Затем он пытается обновить размер текстового поля, что и делают циклы while. Оглядываясь назад, я понимаю, что указанный пользователь ориентируется на Mac, а не на iphone, и мне плохо, что я не читал должным образом. Однако обновить код довольно просто, к сожалению, я не на Mac Atm. - person AdamM; 20.09.2013
comment
Спасибо за ваш ответ, но как мне получить целевую ширину и высоту? Когда я устанавливаю текст в NSTextfield, я не знаю, сколько строк я получу. Я думаю, что вы должны изменить имя своего метода на -(float)getFontSizeToFit:(NSTextField*)aTextField theMultilineTextToFitIn:(NSString*)aString Если вам удастся это сделать, это будет действительно ясно, и вы спросите всех моих ТАК друзей чтобы проголосовать за ваш ответ :) - person Regis_AG; 20.09.2013
comment
Вы можете точно определить, сколько строк занимает TextField, немного подумав, я обновлю свой пост через минуту. - person AdamM; 20.09.2013
comment
Обновил мой ответ. Я надеюсь, что это поможет вам создать метод, который вам нужен. - person AdamM; 20.09.2013