Центрировать многострочный текст на UIButton с помощью IB

Как вы центрируете текст построчно в UIButton с помощью Interface Builder? Перебираю варианты и не вижу. Вот кнопка:

кнопка с текстом не по центру


person sdknewbie    schedule 27.01.2012    source источник
comment
Текст должен быть центрирован по умолчанию. Если бы вы хотели изменить его, вы бы сделали это в разделе «Управление» › «Выравнивание», которое у вас настроено на центрирование по горизонтали и по центру по вертикали. Как сейчас выглядит ваш UIButton?   -  person Sam    schedule 27.01.2012
comment
Все оправдано слева.   -  person sdknewbie    schedule 27.01.2012
comment
Я думаю, что реальная проблема заключается в том, что вы пытаетесь центрировать многострочный текст в UIButton... Я собираюсь изменить ваш заголовок, чтобы отразить это.   -  person Sam    schedule 27.01.2012
comment
Похоже, что UIButton центрирует текст, но центрирует его в целом (т.е. центрируется блок текста, а не каждая отдельная строка). Я только что попробовал это в конструкторе интерфейсов. Вы хотите центрировать каждую строку отдельно?   -  person Sam    schedule 27.01.2012
comment
да. Разве нет встроенного метода для этого? Похоже, что это не может быть сделано в NIB. Я не могу быть первым, кто столкнулся с этой проблемой.   -  person sdknewbie    schedule 28.01.2012


Ответы (7)


Вы не можете установить текст по центру пера. Но вы можете изменить выравнивание в своем коде:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.myButton.titleLabel.textAlignment = UITextAlignmentCenter;
}
person rob mayoff    schedule 27.01.2012
comment
+1 @sdknewbie ты пробовал это? Это интересный ответ, так как он устанавливает выравнивание текста метки на кнопке. Если это исправлено, пожалуйста, отметьте как ответ. Если это не так, оставьте комментарий. - person Sam; 28.01.2012
comment
Эта идея выглядит интригующе, но она не сработала. Я получаю ошибку SIGABRT. Вот запись в журнале. нераспознанный селектор отправлен экземпляру. Я почти уверен, что правильно подключил кнопку, поскольку приложение компилируется, но вылетает, когда я выбираю представление с кнопкой на нем ... но я новичок! - person sdknewbie; 28.01.2012
comment
Запись в журнале также сообщила вам как о нераспознанном селекторе, так и о классе экземпляра, который его получил. Если вы опубликуете и эту информацию, мы сможем быть более полезными. - person rob mayoff; 28.01.2012
comment
Настройка textAlignment = UITextAligmentCenter работает в моем тестовом проекте. - person rob mayoff; 28.01.2012
comment
Я новичок... У меня была другая ошибка. Это работает как шарм! Роб гениален! Я польщен тем, что вы удостоили меня своими знаниями. Спасибо! - person sdknewbie; 29.01.2012
comment
К вашему сведению, это работает для простого заголовка кнопки, но, похоже, не работает для атрибутированного заголовка. - person Axeva; 29.11.2012
comment
UITextAlignmentCenter устарело в iOS6, лучше используйте self.myButton.titleLabel.textAlignment = NSTextAlignmentCenter; - person Esteve; 26.08.2014
comment
для iOS8 (и Swift) вам нужно использовать NSTextAlignment.Center. Если вы создадите свой собственный класс кнопки, вы можете сделать это в его инициализации/конструкторе: self.titleLabel?.textAlignment = NSTextAlignment.Center - person Soko; 31.12.2014

Я знаю, что это старый вопрос, но я столкнулся с ним в своей собственной попытке центрировать многострочный текст UIButton в IB. Я обнаружил, что по умолчанию, когда для «заголовка» установлено значение «обычный», а для «разрыва строки» установлено значение «перенос слов», самая длинная строка текста заголовка центрируется, а другие строки выравниваются по левой стороне этой строки ( аналогично снимку экрана ОП).

Чтобы все строки были отцентрованы правильно, «заголовок» необходимо изменить на «атрибут». Это предоставляет гораздо больше возможностей для настройки внешнего вида текста заголовка. Отцентрируйте каждую из строк текста (теперь вы можете изменить выравнивание для каждой строки отдельно). Также не забудьте установить «разрыв строки» на «перенос слов» под «больше ...» над текстом. Кажется, есть ошибка в том, как ведет себя эта опция разрыва строки, по крайней мере, в Xcode 4.5 в настоящее время, потому что текст на кнопке в IB будет выглядеть неправильно, обрезая все, кроме первой строки. Кажется, что параметры «переноса слов» и усечения интерпретируются в обратном порядке в IB, но если вы запустите приложение, оно будет вести себя правильно в симуляторе.

person Jeff Lockhart    schedule 27.09.2012

На самом деле вы можете сделать это в конструкторе интерфейсов.

Просто установите для заголовка значение «Атрибут», а затем выберите выравнивание по центру.

@from comment : для переноса вам нужно установить разрыв строки на перенос символов или перенос слов.

PS: это может не отображаться в xcode. Но это будет работать во время выполнения.

person Alexander Danilov    schedule 23.12.2014
comment
тогда он не заворачивается, wth? - person Boris Gafurov; 16.06.2015
comment
Для переноса вам нужно установить разрыв строки на перенос символов или перенос слов. - person Borzh; 28.07.2015
comment
Это действительно лучшее решение, потому что оно просто самое простое и удобное без какого-либо кода, даже атрибутов времени выполнения. - person Christopher; 02.10.2015
comment
Это правильный ответ, по крайней мере, в 2016 году и с лучшими версиями Xcode, которые расширяют поддержку IB. - person viggio24; 01.11.2016

Вы можете установить центральный многострочный текст в UIButton через раскадровку.

Вот как вы делаете текст состоящим из двух или более строк.

Установите указанный ниже ключевой путь в

Инспектор удостоверений --> Определенные пользователем атрибуты среды выполнения --> добавить новую пару "ключ-значение" ниже

titleLabel.textAlignment - NSNumber - 1

и

 titleLabel.numberOfLines - NSNumber - 5 - or use "0" meaning "any number"

Это будет выглядеть так:

введите здесь описание изображения

Обратите внимание, что (2016), к сожалению, на самом деле он не отображает две или более строк текста в раскадровке (вы видите только первую), но он отлично работает при запуске в симуляторе или на устройстве.

person Gupta Nishant    schedule 18.11.2014
comment
это сработало, но я пишу как titleLabel.numberOfLines. Я не знаю, работает ли это без заглавных букв. Спасибо. - person EFE; 24.08.2015

Для IB установите для заголовка значение «Атрибуция» и выберите выравнивание по центру (например, предложено Александром Даниловым)

Но если вы хотите сделать это в коде, используя Swift 4:

// center button text
yourButton.titleLabel?.textAlignment = .center 

// enable multiline if needed
yourButton.titleLabel?.numberOfLines = 0 
person budiDino    schedule 19.12.2017

Не все параметры выполняются с помощью Interface Builder, поэтому вы должны сделать некоторые из них с помощью кода, и обычно мы делаем их внутри функции viewDidLoad.

Чтобы центрировать текст внутри кнопки с помощью кода, вы можете использовать следующее:

button1.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;

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

button1.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

Но это уведет текст слишком далеко влево, и вам может понадобиться немного места перед ним, сохраняя выравнивание по левому краю, поэтому вы добавляете вставку после кода выравнивания следующим образом:

button1.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);

В данном случае мы смещаем текст по оси Y на 10 пунктов. Я говорю здесь точки, а не пиксели, потому что, как вы знаете, Apple использует технику точек для измерения расстояний, чтобы иметь возможность легко адаптироваться между обычным дисплеем и дисплеем сетчатки (где сетчатка в 2 раза больше обычного).

person antf    schedule 27.01.2012
comment
-1 как это поможет парню, задавшему вопрос (или кому-то еще)? - person Sam; 28.01.2012
comment
Вопрос касался Interface Builder, а не кода, и этот ответ служит этой цели, говоря, что это невозможно сделать. Более того, этот ответ дает представление о том, где выполнять кодирование (внутри viewDidLoad). Если тот, кто спрашивал, не знал способа кодирования, мы ожидаем, что он прокомментирует этот ответ, и после этого мы ответим на его новый комментарий по коду. По этому я вижу, что этот ответ помогает парню, задающему вопрос, и спасибо за ваш комментарий. - person antf; 28.01.2012
comment
Это справедливый ответ, однако я не могу изменить свой голос, если вы не измените свой ответ (вынужденное ограничение SO после того, как прошло столько часов - кто знал). Хотя мне бы хотелось увидеть альтернативное решение, вы правы, что пользователь его не просил. - person Sam; 30.01.2012

Я еще не пробовал, но я думаю, что это можно сделать, создав CGRect поверх вашей кнопки, затем используя его как рамку, создав метку, а затем вы можете поиграть с меткой, установить textAlignment, чтобы быть UITextAlignmentCenter, и установить цвет фона, чтобы быть прозрачным.

Это работает с uitableview, но я не знаю, будет ли это работать для кнопки. Надеюсь это поможет.

person Raymond Wang    schedule 27.01.2012