Кнопка UIB с двумя строками текста в заголовке (numberOfLines = 2) - PullRequest
79 голосов
/ 20 октября 2011

Я пытаюсь создать UIButton, в заголовке которого есть две строки текста.Это код, который я использую:

    UIButton *titleButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleButton.titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    [titleButton setTitle:@"This text is very long and should get truncated at the end of the second line" forState:UIControlStateNormal];
    titleButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    titleButton.titleLabel.numberOfLines = 2;
    [self addSubview:titleButton];

Когда я пытаюсь это сделать, текст отображается только в одну строку.Кажется, единственный способ получить более чем одну строку текста в UIButton.titleLabel - это установить numberOfLines=0 и использовать UILineBreakModeWordWrap.Но это не гарантирует, что текст будет точно в две строки.

Использование простого UILabel, однако, работает:

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
    titleLabel.numberOfLines = 2;
    titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    [self addSubview:titleLabel];

Кто-нибудь знает, как сделать UIButton работа с двумя строчками?Является ли единственным решением создать отдельный UILabel для хранения текста и добавить его в качестве подпредставления для кнопки?

Ответы [ 6 ]

145 голосов
/ 10 мая 2013

Вам не нужно добавлять UILabel в UIButton. Это просто дополнительные объекты и работа.

Установите эти свойства на titleLabel вашей кнопки.

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2;//if you want unlimited number of lines put 0

Swift:

button.titleLabel!.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel!.numberOfLines = 2//if you want unlimited number of lines put 0
86 голосов
/ 18 января 2012

Вы можете сделать это намного проще, без кода не требуется. В Интерфейсном Разработчике установите Line Break на UIButton в Word Wrap. Чем вы можете вставить несколько строк заголовка. Просто нажмите Option + Return, чтобы создать новую строку. Вам также необходимо добавить это в пользовательский атрибут времени выполнения в Интерфейсном Разработчике:

titleLabel.textAlignment Number [1]

Это так просто. Надеюсь, это поможет ...

73 голосов
/ 20 октября 2011

Обновленный ответ для более новых версий iOS

Поскольку это принятый ответ, добавим ответ Шона здесь:

Установите эти свойства на titleLabel вашей кнопки.

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2; // if you want unlimited number of lines put 0

Свифт 3 и 4:

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.numberOfLines = 2 // if you want unlimited number of lines put 0

Оригинальный ответ для более старой версии iOS

Если вам нужно 2 строки текста поверх вашего UIButton, вы должны добавить UIlabel поверх него, который именно это и делает.

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
titleLabel.numberOfLines = 2;
titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
[myButton addSubview:titleLabel]; //add label to button instead.

Обновлено для решения конструктора интерфейсов

Добавлен ответ @Borut Tomazin для более полного ответа. Обновил эту часть еще раз, так как ответ @Borut Tomazin был улучшен.

Вы можете сделать это намного проще, без кода. В Интерфейсном Разработчике установите Line Break на UIButton в Word Wrap. Чем вы можете вставить несколько строк заголовка. Просто нажмите Option + Return, чтобы создать новую строку. Вам также необходимо добавить это в пользовательский атрибут времени выполнения в Интерфейсном Разработчике:

titleLabel.textAlignment Number [1]
20 голосов
/ 18 марта 2014
 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];
9 голосов
/ 09 августа 2014

Чтобы полностью избежать необходимости редактировать код и, следовательно, необходимость подкласса своего представления, в Xcode5 и выше вы можете следовать предложению Борута Томазина:

В Интерфейсном Разработчике (или раскадровка) установить перевод строки в перенос слов.Чем вы можете вставить несколько строк заголовка.Просто нажмите Option + Возврат ключей, чтобы создать новую строку.

, а затем в Определенные пользователем атрибуты времени выполнения , которые вы можете добавить

Путь к ключу: titleLabel.textAlignment
Тип: Number
Значение: 1

Примечание: это может быть не совсем «будущее», так как мыпереводим константу UITextAlignmentCenter в ее числовое значение (и эта константа может измениться с выходом новых версий iOS), но в ближайшем будущем она кажется безопасной.

0 голосов
/ 28 марта 2018

Вы можете изменить нужное значение прямо из раскадровки.Нажмите кнопку, перейдите в инспектор идентификации и добавьте следующую пару ключ-значение в разделе «Пользовательские атрибуты среды выполнения»:

enter image description here

...