Underline button text in Swift
Swift 5 / Xcode 12
@IBOutlet weak var myButton: UIButton! let yourAttributes: [NSAttributedString.Key: Any] = [ .font: UIFont.systemFont(ofSize: 14), .foregroundColor: UIColor.blue, .underlineStyle: NSUnderlineStyle.single.rawValue ] // .double.rawValue, .thick.rawValue override func viewDidLoad() { super.viewDidLoad() let attributeString = NSMutableAttributedString( string: "Your button text", attributes: yourAttributes ) myButton.setAttributedTitle(attributeString, for: .normal) }
Swift 4 / Xcode 9
@IBOutlet weak var myButton: UIButton! let yourAttributes: [NSAttributedStringKey: Any] = [ NSAttributedStringKey.font: UIFont.systemFont(ofSize: 14), NSAttributedStringKey.foregroundColor: UIColor.blue, NSAttributedStringKey.underlineStyle: NSUnderlineStyle.styleSingle.rawValue ] // .styleDouble.rawValue, .styleThick.rawValue, .styleNone.rawValue override func viewDidLoad() { super.viewDidLoad() let attributeString = NSMutableAttributedString( string: "Your button text", attributes: yourAttributes ) myButton.setAttributedTitle(attributeString, for: .normal) }
Swift 3 / Xcode 8
@IBOutlet weak var myButton: UIButton! let yourAttributes: [String: Any] = [ NSFontAttributeName: UIFont.systemFont(ofSize: 14), NSForegroundColorAttributeName: UIColor.white, NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue ] // .styleDouble.rawValue, .styleThick.rawValue, .styleNone.rawValue override func viewDidLoad() { super.viewDidLoad() let attributeString = NSMutableAttributedString( string: "Your button text", attributes: yourAttributes ) myButton.setAttributedTitle(attributeString, for: .normal) }
Here you go, just tested it. (works in xCode 7 Beta at least)
@IBOutlet weak var yourButton: UIButton!var attrs = [NSFontAttributeName : UIFont.systemFontOfSize(19.0),NSForegroundColorAttributeName : UIColor.redColor(),NSUnderlineStyleAttributeName : 1]var attributedString = NSMutableAttributedString(string:"")override func viewDidLoad() { super.viewDidLoad() let buttonTitleStr = NSMutableAttributedString(string:"My Button", attributes:attrs) attributedString.appendAttributedString(buttonTitleStr) yourButton.setAttributedTitle(attributedString, forState: .Normal)}
if you are looking for a way to do this without inheritance -
swift 3/4/5
// in swift 4 - switch NSUnderlineStyleAttributeName with NSAttributedStringKey.underlineStyleextension UIButton { func underline() { guard let text = self.titleLabel?.text else { return } let attributedString = NSMutableAttributedString(string: text) //NSAttributedStringKey.foregroundColor : UIColor.blue attributedString.addAttribute(NSAttributedString.Key.underlineColor, value: self.titleColor(for: .normal)!, range: NSRange(location: 0, length: text.count)) attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: self.titleColor(for: .normal)!, range: NSRange(location: 0, length: text.count)) attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: text.count)) self.setAttributedTitle(attributedString, for: .normal) }}extension UILabel { func underline() { if let textString = self.text { let attributedString = NSMutableAttributedString(string: textString) attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: attributedString.length - 1)) attributedText = attributedString } }}