Swift - UIButton с двумя строками текста
Мне было интересно, можно ли создать UIButton с двумя строками текста. Мне нужна каждая строка, чтобы иметь другой размер шрифта. Первая строка будет 17, а вторая - 11. Я пробовал возиться с помещением двух меток внутри UIButton, но я не могу заставить их оставаться в пределах кнопки.
Я пытаюсь сделать все это в ui builder, а не программно.
Спасибо
Ответы
Ответ 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)