Показать название в двух отдельных строках для UIButton [duplicate]

Если вы не хотите использовать какой-либо объект, вы все равно можете использовать setattr() внутри вашего текущего модуля:

import sys current_module = module = sys.modules[__name__] # i.e the "file" where your code is written setattr(current_module, 'variable_name', 15) # 15 is the value you assign to the var print(variable_name) # >>> 15, created from a string
55
задан Scott 6 June 2015 в 05:43
поделиться

8 ответов

Есть два вопроса.

Мне было интересно, можно ли создать UIButton с двумя строками текста

Это возможно с помощью раскадровки или программным способом.

Раскадровка:

Измените «Режим прерывания строки» на обертку символов и используйте клавишу Alt / Option + Enter, чтобы ввести новую строку в поле Title UIButton.

enter image description here [/g0]

Программно:

override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;
}

Мне нужна каждая строка, чтобы иметь другой размер шрифта 1

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

Лучше всего использовать NSMutableAttributedString. Обратите внимание, что это может быть достигнуто только программным способом.

@IBOutlet weak var btnTwoLine: UIButton?

override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        //applying the line break mode
        btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;

        var buttonText: NSString = "hello\nthere"

        //getting the range to separate the button title strings
        var newlineRange: NSRange = buttonText.rangeOfString("\n")

        //getting both substrings
        var substring1: NSString = ""
        var substring2: NSString = ""

        if(newlineRange.location != NSNotFound) {
            substring1 = buttonText.substringToIndex(newlineRange.location)
            substring2 = buttonText.substringFromIndex(newlineRange.location)
        }

        //assigning diffrent fonts to both substrings
        let font:UIFont? = UIFont(name: "Arial", size: 17.0)
        let attrString = NSMutableAttributedString(
            string: substring1 as String,
            attributes: NSDictionary(
                object: font!,
                forKey: NSFontAttributeName) as [NSObject : AnyObject])

        let font1:UIFont? = UIFont(name: "Arial", size: 11.0)
        let attrString1 = NSMutableAttributedString(
            string: substring2 as String,
            attributes: NSDictionary(
                object: font1!,
                forKey: NSFontAttributeName) as [NSObject : AnyObject])

        //appending both attributed strings
        attrString.appendAttributedString(attrString1)

        //assigning the resultant attributed strings to the button
        btnTwoLine?.setAttributedTitle(attrString, forState: UIControlState.Normal)

    }

Выход

enter image description here [/g1]

131
ответ дан Shamsudheen TK 21 August 2018 в 07:49
поделиться
  • 1
    Прекрасно работает. Теперь мне интересно, есть ли способ центрировать текст в каждой строке, и если есть какой-либо способ вставить больше пространства между двумя строками. – Scott 6 June 2015 в 16:23
  • 2
    вы можете совместить текст линии с центром. напишите следующий код btnTwoLine? .titleLabel? .textAlignment = NSTextAlignment.Center или сделайте это с помощью файла раскадровки (раздел управления - & gt; Alignment) – Shamsudheen TK 7 June 2015 в 06:28
  • 3
    могу ли я знать, в чем заключается цель размещения большего количества строк между ними? – Shamsudheen TK 7 June 2015 в 06:28
  • 4
    Это зависит от размера кнопки. Если кнопка большая, то две строки текста будут расположены посередине, с большим пространством сверху и снизу. Это не тот взгляд, за которым я шел. – Scott 7 June 2015 в 15:47
  • 5
    yo должны применить некоторые трюки здесь :) вы можете добавить больше строк между несколькими\n. Я имею в виду, "hello\n\n\nthere & quot; даст вам три пробела. однако, не забудьте изменить свой код var newlineRange: NSRange = buttonText.rangeOfString (& quot;\n\n\n & quot;) – Shamsudheen TK 7 June 2015 в 17:15

Я исправил это, и мое решение было только в раскадровке.

Изменения:

Он добавлен в Identity Inspector -> Пользовательские атрибуты времени выполнения (эти KeyPaths):

  • numberOfLines = 2
  • titleLabel.textAlignment = 1

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

Он добавлен в инспектор атрибутов:

  • line break = word wrap

Word wrap ]

0
ответ дан A. Trejo 21 August 2018 в 07:49
поделиться

измените разрыв строки на обертку символа, выберите свою кнопку и инспектор атрибутов перейдите к разрыву строки и измените ее на обертку символа

enter image description here [/g0]

4
ответ дан AndroidDev 21 August 2018 в 07:49
поделиться

Синтаксис SWIFT 3

let str = NSMutableAttributedString(string: "First line\nSecond Line")
str.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 17), range: NSMakeRange(0, 10))
str.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 12), range: NSMakeRange(11, 11))
button.setAttributedTitle(str, for: .normal)
4
ответ дан Maksim Kniazev 21 August 2018 в 07:49
поделиться
  • 1
    Спасибо за это! Работал для меня. – A.J. Hernandez 21 March 2017 в 18:54
  • 2
    не знаю почему, но мне пришлось добавить button.titleLabel? .numberOfLines = 0 – budidino 7 July 2017 в 23:21

Я заметил проблему в большинстве решений, которая при создании режима разрыва строки на «Wrap Wrap» вторая строка будет выровнена по первой строке

Чтобы сделать все линии центрированными. просто измените заголовок From Plain to Attributed, а затем вы можете сделать каждую линию по центру

5
ответ дан Musa almatri 21 August 2018 в 07:49
поделиться

Я искал почти ту же тему, за исключением того, что мне не нужны два разных размера шрифта. Если кто-то ищет простое решение:

    let button = UIButton()
    button.titleLabel?.numberOfLines = 0
    button.titleLabel?.lineBreakMode = .byWordWrapping
    button.setTitle("Foo\nBar", for: .normal)
    button.titleLabel?.textAlignment = .center
    button.sizeToFit()
    button.addTarget(self, action: #selector(rightBarButtonTapped), for: .allEvents)
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)
7
ответ дан Nico S. 21 August 2018 в 07:49
поделиться

Вам нужно сделать часть этого кода. вы не можете установить 2 разных шрифта в IB. В дополнение к изменению режима разрыва строки на обертку символов вам нужно что-то подобное, чтобы установить заголовок,

override func viewDidLoad() {
        super.viewDidLoad()
        var str = NSMutableAttributedString(string: "First line\nSecond Line")
        str.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(17), range: NSMakeRange(0, 10))
        str.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(12), range: NSMakeRange(11, 11))
        button.setAttributedTitle(str, forState: .Normal)

    }
0
ответ дан rdelmar 21 August 2018 в 07:49
поделиться

Один из способов сделать это с ярлыками, я думаю. Я сделал это, и он работает нормально. Я мог бы создать это как UIButton, а затем выставить ярлыки, я думаю. Я не знаю, имеет ли это смысл.

    let firstLabel = UILabel()

    firstLabel.backgroundColor = UIColor.lightGrayColor()
    firstLabel.text = "Hi"
    firstLabel.textColor = UIColor.blueColor()
    firstLabel.textAlignment = NSTextAlignment.Center
    firstLabel.frame = CGRectMake(0, testButton.frame.height * 0.25, testButton.frame.width, testButton.frame.height * 0.2)
    testButton.addSubview(firstLabel)

    let secondLabel = UILabel()

    secondLabel.backgroundColor = UIColor.lightGrayColor()
    secondLabel.textColor = UIColor.blueColor()
    secondLabel.font = UIFont(name: "Arial", size: 12)
    secondLabel.text = "There"
    secondLabel.textAlignment = NSTextAlignment.Center
    secondLabel.frame = CGRectMake(0, testButton.frame.height * 0.5, testButton.frame.width, testButton.frame.height * 0.2)
    testButton.addSubview(secondLabel)
0
ответ дан Scott 21 August 2018 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: