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 чтобы удерживать текст и добавить его в качестве подвида кнопки?

6 73

6 ответов:

обновленный ответ для более поздних версий 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.

обновлено для решения interface builder

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

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

titleLabel.textAlignment Number [1]

вам не нужно добавлять UILabel в 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

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

titleLabel.textAlignment Number [1]

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

 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

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

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

В Interface Builder (или раскадровки) установить разрыв линии на перенос по словам. Чем вы можете вставить несколько строк заголовка. Просто нажать опции + возвращение клавиши для создания новой строки.

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

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

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

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

enter image description here