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)