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), но в ближайшем будущем она кажется безопасной.