Swift – 两行文本的UIButton

我想知道是否可以用两行文本创build一个UIButton。 我需要每一行有不同的字体大小。 第一行是17点,第二行是11点。 我试着把UIButton放在两个标签,但我不能让他们留在button的边界内。

我试图在UI构build器中完成所有这些,而不是以编程方式。

谢谢

有两个问题。

我想知道是否可以用两行文本创build一个UIButton

这可以通过使用故事板或以编程方式。

故事板:

将“换行符模式”更改为“ 字符换行”,并使用Alt / Option + Enter键在UIButton的“标题”字段中input新行。

在这里输入图像说明

编程方式:

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) } 

产量

在这里输入图像说明

把换行换成字符换行,select你的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) 

我已经注意到大多数解决scheme中的一个问题,在将换行符模式设置为“字符换行”时,第二行将左alignment到第一行

使所有的行都居中。 只要将标题从普通(Plain)改为已分配(Attributed),然后就可以使每一行居中

归因于中心标题

你需要在代码中做一些这个。 您不能在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) } 

一个办法是用标签,我猜。 我这样做,似乎工作正常。 我可以创build这个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) 

我已经解决了这个问题,我的解决scheme只在故事板。

变化:

它添加在Identity Inspector – >用户定义的运行时属性 (这些KeyPaths)中:

  • numberOfLines = 2
  • titleLabel.textAlignment = 1

用户定义的运行时属性

它在属性检查器中添加:

  • 换行=换行

自动换行

我正在寻找几乎相同的主题,除了我不需要两个不同的字体大小。 如果有人正在寻找一个简单的解决scheme:

  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)