UIButton с двумя строками текста в заголовке (numberOfLines = 2)

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

    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 для хранения текста и добавления его в качестве поднабора кнопки?

Ответ 1

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

Так как это принятый ответ, добавлен ответ @Sean:

Установите эти свойства в заголовке вашей кнопки.

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

Swift 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.

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

titleLabel.textAlignment Number [1]

Ответ 2

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

Установите эти свойства в заголовке вашей кнопки.

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

Ответ 3

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

titleLabel.textAlignment Number [1]

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

Ответ 4

 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

Ответ 5

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

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

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

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

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