Есть два вопроса.
Мне было интересно, можно ли создать UIButton с двумя строками текста
Это возможно с помощью раскадровки или программно.
Раскадровка:
Изменение «Line Mode» Перерыв для символов Wrap или Word Wrap и используйте Alt / Option + Enter ключ , чтобы ввести новую строку в поле заголовка UIButton в.
Программно:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;
}
Мне нужно, чтобы каждая строка имела другой размер шрифта 1
В худшем случае вы можете использовать собственный UIButton
класс и добавить в него две метки.
Лучший способ - использовать NSMutableAttributedString
. Обратите внимание, что это может быть достигнуто только программно.
Swift 5:
@IBOutlet weak var btnTwoLine: UIButton?
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
textResponseButton?.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping;
let buttonText: NSString = "hello\nthere"
let newlineRange: NSRange = buttonText.range(of: "\n")
var substring1 = ""
var substring2 = ""
if(newlineRange.location != NSNotFound) {
substring1 = buttonText.substring(to: newlineRange.location)
substring2 = buttonText.substring(from: newlineRange.location)
}
let font1: UIFont = UIFont(name: "Arial", size: 17.0)!
let attributes1 = [NSMutableAttributedString.Key.font: font1]
let attrString1 = NSMutableAttributedString(string: substring1, attributes: attributes1)
let font2: UIFont = UIFont(name: "Arial", size: 11.0)!
let attributes2 = [NSMutableAttributedString.Key.font: font2]
let attrString2 = NSMutableAttributedString(string: substring2, attributes: attributes2)
attrString1.append(attrString2)
textResponseButton?.setAttributedTitle(attrString1, for: [])
}
Старый Свифт
@IBOutlet weak var btnTwoLine: UIButton?
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;
var buttonText: NSString = "hello\nthere"
var newlineRange: NSRange = buttonText.rangeOfString("\n")
var substring1: NSString = ""
var substring2: NSString = ""
if(newlineRange.location != NSNotFound) {
substring1 = buttonText.substringToIndex(newlineRange.location)
substring2 = buttonText.substringFromIndex(newlineRange.location)
}
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])
attrString.appendAttributedString(attrString1)
btnTwoLine?.setAttributedTitle(attrString, forState: UIControlState.Normal)
}
Выход
Я искал почти ту же тему, за исключением того, что мне не нужны два разных размера шрифта. Если кто-то ищет простое решение:
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)
источник
Я заметил проблему в большинстве решений, которая заключается в том, что при переводе режима разрыва строки в «Перенос символов» вторая строка будет выровнена по левому краю относительно первой строки.
Чтобы все линии были по центру. просто измените заголовок с простого на с атрибуцией, а затем вы можете сделать каждую линию центрированной
источник
измените разрыв строки на перенос символов, выберите свою кнопку и в инспекторе атрибутов перейдите к разрыву строки и измените его на перенос символов
источник
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)
источник
Я исправил это, и мое решение было только в раскадровке.
Изменения:
Он добавил в Identity Inspector -> User Defined Runtime Attributes (эти KeyPaths):
Атрибуты времени выполнения, определяемые пользователем
Я добавил это в инспекторе атрибутов:
Перенос слова
источник
Вам нужно сделать что-то из этого в коде. в IB нельзя установить 2 разных шрифта. Помимо изменения режима переноса строки на перенос символов, вам нужно что-то вроде этого, чтобы установить заголовок,
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) }
источник
Думаю, один из способов сделать это - использовать ярлыки. Я сделал это, и вроде работает нормально. Я мог бы создать это как 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)
источник
мой путь:
func setButtonTitle(title: String, subtitle: String, button: UIButton){ //applying the line break mode button.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping; let title = NSMutableAttributedString(string: title, attributes: Attributes.biggestLabel) let subtitle = NSMutableAttributedString(string: subtitle, attributes: Attributes.label) let char = NSMutableAttributedString(string: "\n", attributes: Attributes.biggestLabel) title.append(char) title.append(subtitle) button.setAttributedTitle(title, for: .normal) }
источник
Предлагаемые решения, к сожалению, не сработали для меня, когда я хотел иметь многолинейную кнопку внутри CollectionView. Затем коллега показал мне обходной путь, которым я хотел поделиться на случай, если у кого-то возникнет такая же проблема - надеюсь, это поможет! Создайте класс, унаследованный от UIControl, и дополните его меткой, которая затем будет вести себя аналогично кнопке.
class MultilineButton: UIControl { let label: UILabel = { $0.translatesAutoresizingMaskIntoConstraints = false $0.numberOfLines = 0 $0.textAlignment = .center return $0 }(UILabel()) override init(frame: CGRect) { super.init(frame: frame) addSubview(label) NSLayoutConstraint.activate([ label.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor), label.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor), label.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor), label.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor) ]) } override var isHighlighted: Bool { didSet { backgroundColor = backgroundColor?.withAlphaComponent(isHighlighted ? 0.7 : 1.0) label.textColor = label.textColor.withAlphaComponent(isHighlighted ? 0.7 : 1.0) } } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
источник