Подтвердить что ты не робот

Swift - UIButton с двумя строками текста

Мне было интересно, можно ли создать UIButton с двумя строками текста. Мне нужна каждая строка, чтобы иметь другой размер шрифта. Первая строка будет 17, а вторая - 11. Я пробовал возиться с помещением двух меток внутри UIButton, но я не могу заставить их оставаться в пределах кнопки.

Я пытаюсь сделать все это в ui builder, а не программно.

Спасибо

4b9b3361

Ответ 1

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

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

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

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

Изменение "Line Mode" Перерыв между символами Wrap или Word, Wrap и используйте Alt/Option + Enter ключ, чтобы ввести новую строку в поле UIButton заголовка.

enter image description here

Программный:

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

Ответ 2

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

    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)

Ответ 3

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

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

attributed centered title

Ответ 4

Синтаксис 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)

Ответ 5

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

enter image description here

Ответ 6

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

Изменения:

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

  • numberOfLines = 2
  • titleLabel.textAlignment = 1

Определяемые пользователем атрибуты времени выполнения

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

  • перевод строки = перенос слов

Перенос слова

Ответ 7

Вам нужно сделать часть этого кода. вы не можете установить 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)

    }

Ответ 8

Один из способов сделать это с ярлыками, я думаю. Я сделал это, и он работает нормально. Я мог бы создать это как 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)