Как добавить многострочный текст в UIButton?

голоса
313

У меня есть следующий код ...

UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @Long text string;
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];

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

Задан 03/03/2009 в 01:22
источник пользователем
На других языках...                            


26 ответов

голоса
618

Для IOS 6 и выше, используйте следующую команду, чтобы разрешить несколько строк:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
// you probably want to center it
button.titleLabel.textAlignment = NSTextAlignmentCenter; // if you want to 
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

Для прошивки 5 и ниже, используйте следующие, чтобы несколько строк:

button.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
// you probably want to center it
button.titleLabel.textAlignment = UITextAlignmentCenter;
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

2017, для iOS9 вперед ,

как правило, просто сделать эти две вещи:

  1. выбрать « приписываемой Текст»
  2. во всплывающем окне «Line Break» выбрать «Слово Wrap»
Ответил 01/12/2009 в 23:34
источник пользователем

голоса
114

Выбранный ответ является правильным, но если вы предпочитаете делать такого рода вещи в Interface Builder вы можете сделать это:

фильм

Ответил 14/05/2014 в 16:36
источник пользователем

голоса
53

Для IOS 6:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;

В виде

UILineBreakModeWordWrap and UITextAlignmentCenter

осуждаются в IOS 6 и далее ..

Ответил 08/10/2012 в 08:14
источник пользователем

голоса
41

Если вы хотите добавить кнопку с названием центра с несколькими линиями, установите настройки вашего интерфейс Строителя для кнопки:

[ Вот]

Ответил 21/10/2015 в 09:03
источник пользователем

голоса
28

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

button.titleLabel?.numberOfLines = 0
Ответил 28/10/2010 в 16:45
источник пользователем

голоса
17

СВИФТ 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)
Ответил 08/05/2017 в 09:56
источник пользователем

голоса
10

Существует более простой способ:

someButton.lineBreakMode = UILineBreakModeWordWrap;

(Edit для прошивки 3 и более поздних версий :)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Ответил 25/10/2009 в 20:48
источник пользователем

голоса
9

Выравнивание по левому краю на iOS7 с autolayout:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
Ответил 28/06/2013 в 20:07
источник пользователем

голоса
7

Прежде всего, вы должны знать , что UIButton уже есть UILabel внутри него. Вы можете установить его с помощью –setTitle:forState:.

Проблема с вашим примером является то , что вам нужно установить UILabel в numberOfLinesсобственность на нечто иное , чем его значение 1. Вы должны также рассмотреть по умолчанию lineBreakModeсвойства.

Ответил 03/03/2009 в 09:35
источник пользователем

голоса
4

Ответы здесь сказать вам, как достичь многострочного названия кнопки программно.

Я просто хотел бы добавить, что если вы используете раскадровки, вы можете набрать [Ctrl + Enter], чтобы заставить строку на титульной кнопку поля.

НТН

Ответил 01/05/2013 в 10:50
источник пользователем

голоса
4

Для тех, кто использует Xcode 4 в раскадровку, вы можете нажать на кнопку, и на правой стороне панели Utilities под Attributes Inspector, вы увидите опцию Line Break. Выберите слово Wrap, и вы должны быть хорошо идти.

Ответил 09/05/2012 в 19:12
источник пользователем

голоса
3

Что касается идеи Брента сдачи в заголовке UILabel в целях сиблингов, это не кажется мне, как очень хорошая идея. Я продолжаю думать в задачах взаимодействия с UILabel из-за его события прикосновения не доходят зрения UIButton в.

С другой стороны, с UILabel как подвид в UIButton, я довольно комфортабельный, зная, что события прикосновения всегда будут распространяться на надтаблицы в UILabel в.

Я этот подход и не заметил никаких проблем, сообщенных с BackgroundImage. Я добавил этот код в -titleRectForContentRect: подкласс UIButton но код также может быть помещен в чертеже рутины надтаблицы UIButton, что в этом случае вы должны заменить все ссылки на себя с переменным в UIButton в.

#define TITLE_LABEL_TAG 1234

- (CGRect)titleRectForContentRect:(CGRect)rect
{   
    // define the desired title inset margins based on the whole rect and its padding
    UIEdgeInsets padding = [self titleEdgeInsets];
    CGRect titleRect = CGRectMake(rect.origin.x    + padding.left, 
                                  rect.origin.x    + padding.top, 
                                  rect.size.width  - (padding.right + padding.left), 
                                  rect.size.height - (padding.bottom + padding].top));

    // save the current title view appearance
    NSString *title = [self currentTitle];
    UIColor  *titleColor = [self currentTitleColor];
    UIColor  *titleShadowColor = [self currentTitleShadowColor];

    // we only want to add our custom label once; only 1st pass shall return nil
    UILabel  *titleLabel = (UILabel*)[self viewWithTag:TITLE_LABEL_TAG];


    if (!titleLabel) 
    {
        // no custom label found (1st pass), we will be creating & adding it as subview
        titleLabel = [[UILabel alloc] initWithFrame:titleRect];
        [titleLabel setTag:TITLE_LABEL_TAG];

        // make it multi-line
        [titleLabel setNumberOfLines:0];
        [titleLabel setLineBreakMode:UILineBreakModeWordWrap];

        // title appearance setup; be at will to modify
        [titleLabel setBackgroundColor:[UIColor clearColor]];
        [titleLabel setFont:[self font]];
        [titleLabel setShadowOffset:CGSizeMake(0, 1)];
        [titleLabel setTextAlignment:UITextAlignmentCenter];

        [self addSubview:titleLabel];
        [titleLabel release];
    }

    // finally, put our label in original title view's state
    [titleLabel setText:title];
    [titleLabel setTextColor:titleColor];
    [titleLabel setShadowColor:titleShadowColor];

    // and return empty rect so that the original title view is hidden
    return CGRectZero;
}

Я брал время и написал немного больше об этом здесь . Там, я также отметить более короткое решение, хотя это не совсем подходит для всех сценариев и включает в себя некоторые частные взгляды хакинга. Также, вы можете скачать подкласс UIButton готов к использованию.

Ответил 09/03/2009 в 15:25
источник пользователем

голоса
2

Вы должны добавить этот код:

buttonLabel.titleLabel.numberOfLines = 0;
Ответил 21/02/2018 в 11:41
источник пользователем

голоса
2

Если вы используете автоматическую раскладку.

button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.numberOfLines = 2
Ответил 09/12/2016 в 10:55
источник пользователем

голоса
2

Установка lineBreakMode в NSLineBreakByWordWrapping (либо в IB или код) делает надпись на кнопке многострочный, но не влияет на кадр кнопки.

Если кнопка имеет динамический заголовок, есть один трюк: положить скрытый UILabel с таким же шрифтом и связать его высота высоту баттона с компоновкой; при установке текст кнопки и метки и autolayout сделает всю работу.

Заметка

Внутренняя высота размер одной кнопки строки больше, чем метка, так, чтобы предотвратить рост лейбла сжиматься это вертикальный Content обниматься Приоритет должен быть больше, чем вертикальный Content баттона сжатия сопротивления.

Ответил 31/08/2015 в 20:21
источник пользователем

голоса
2

Если вы используете автоматическое расположение на IOS 6 может также потребоваться установить preferredMaxLayoutWidthсвойство:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
button.titleLabel.preferredMaxLayoutWidth = button.frame.size.width;
Ответил 01/05/2013 в 19:45
источник пользователем

голоса
2

Он отлично работает.

Добавить использовать этот конфигурационный файл, как Plist, вам нужно использовать CDATA написать многострочное название, как это:

<string><![CDATA[Line1
Line2]]></string>
Ответил 11/05/2011 в 11:04
источник пользователем

голоса
1
self.btnError.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)
Ответил 03/08/2017 в 09:40
источник пользователем

голоса
0

В Swift 5.0 и Xcode 10.2

SharedClass пример написать один раз и использовать все изделия

Это ваш разделяемой класс (как это использовать все компоненты свойств)

import UIKit

class SharedClass: NSObject {

     static let sharedInstance = SharedClass()

     private override init() {

     }
  }

//UIButton extension
extension UIButton {
     //UIButton properties
     func btnMultipleLines() {
         titleLabel?.numberOfLines = 0
         titleLabel?.lineBreakMode = .byWordWrapping
         titleLabel?.textAlignment = .center        
     }
}

В вашем ViewController вызова , как это

button.btnMultipleLines()//This is your button
Ответил 29/04/2019 в 07:54
источник пользователем

голоса
0

У меня была проблема с авто-макета, после включения многострочный результат был так: поэтому размер не влияет на размер кнопки я добавил , основанный на (в данном случае contentEdgeInsets было (10, 10, 10, 10 ) после вызова : надеюсь , что это поможет вам (скоро 5.0):
введите описание изображения здесь
titleLabel
ConstraintscontentEdgeInsets
makeMultiLineSupport()
введите описание изображения здесь

extension UIButton {

    func makeMultiLineSupport() {
        guard let titleLabel = titleLabel else {
            return
        }
        titleLabel.numberOfLines = 0
        titleLabel.setContentHuggingPriority(.required, for: .vertical)
        titleLabel.setContentHuggingPriority(.required, for: .horizontal)
        addConstraints([
            .init(item: titleLabel,
                  attribute: .top,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .top,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.top),
            .init(item: titleLabel,
                  attribute: .bottom,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .bottom,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.bottom),
            .init(item: titleLabel,
                  attribute: .left,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .left,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.left),
            .init(item: titleLabel,
                  attribute: .right,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .right,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.right)
            ])
    }

}
Ответил 11/04/2019 в 21:25
источник пользователем

голоса
0

В эти дни, если вам действительно нужно такого рода вещи должны быть доступны в интерфейсе строителя на индивидуальной основе случая, вы можете сделать это с простым расширением, как это:

extension UIButton {
    @IBInspectable var numberOfLines: Int {
        get { return titleLabel?.numberOfLines ?? 1 }
        set { titleLabel?.numberOfLines = newValue }
    }
}

Тогда вы можете просто установить numberOfLines как атрибут на любой UIButton или UIButton подкласса, как если бы это был лейбл. То же самое касается и целого ряда других, как правило, недоступных значений, таких как угол радиуса слоя в целях, либо атрибуты тени, которые он отбрасывает.

Ответил 17/11/2018 в 07:12
источник пользователем

голоса
0

В Xcode 9.3 вы можете сделать это с помощью раскадровки , как показано ниже,

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

Вы должны установить название кнопки TextAlignment к центру

button.titleLabel?.textAlignment = .center

Вам не нужно устанавливать текст заголовка с новой строки (\ п), как показано ниже,

button.setTitle("Good\nAnswer",for: .normal)

Просто установите название,

button.setTitle("Good Answer",for: .normal)

Вот результат,

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

Ответил 31/05/2018 в 06:14
источник пользователем

голоса
0

Я включил ответ jessecurry в пределах STAButton , который является частью моей STAControls библиотеки с открытым исходным кодом. Я в настоящее время использовать его в одном из приложений я разрабатывающие и это работает для моих потребностей. Не стесняйтесь открывать вопросы о том , как улучшить его или отправить мне тянуть запросы.

Ответил 05/05/2018 в 23:27
источник пользователем

голоса
0

скор 4,0

btn.titleLabel?.lineBreakMode = .byWordWrapping
btn.titleLabel?.textAlignment = .center
btn.setTitle( "Line1\nLine2", for: .normal)
Ответил 25/03/2018 в 12:50
источник пользователем

голоса
0

Ролл своего собственного класса кнопки. Это, безусловно, лучшим решением в долгосрочной перспективе. UIButton и другие классы UIKit очень ограничительные, как вы можете настроить их.

Ответил 10/03/2009 в 14:16
источник пользователем

голоса
-3

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

Другими словами:

[button.superview addSubview:myLabel];
myLabel.center = button.center;
Ответил 03/03/2009 в 13:04
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more