Unterstreichen Sie den Schaltflächentext in Swift

78

Ich habe UIButton. Im Interface Builder habe ich den Titel auf 'Attributed' gesetzt. Wie kann ich festlegen, dass der Titel in Swift vom Code unterstrichen wird?

@IBOutlet weak var myBtn: UIButton!

Ich habe eine Funktion erstellt, die beim touchUpInside-Ereignis dieser Schaltfläche aufgerufen wird:

var attributedString = NSMutableAttributedString(string:"new text")
    var attrs = [
        NSFontAttributeName : UIFont.systemFontOfSize(19.0),
        NSForegroundColorAttributeName : UIColor.redColor()
    ]
    var gString = NSMutableAttributedString(string:"g", attributes:attrs)
    attributedString.appendAttributedString(gString)

    myBtn.titleLabel?.attributedText = attributedString;

Aber immer noch kein Ergebnis. Außerdem muss ich wissen, wie ich auf das Unterstreichungsattribut zugreifen kann. Text, Größe und Farbe bleiben gleich.

Moonvader
quelle
Vielen Dank, aber aus irgendeinem Grund nicht arbeiten. Ich muss auch über das Unterstreichungsattribut Bescheid wissen.
Moonvader

Antworten:

90

Los geht's, habe es einfach getestet. (funktioniert mindestens in xCode 7 Beta)

@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)
}
36 Mit Absicht
quelle
106

Swift 5 / Xcode 11

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

Geben Sie hier die Bildbeschreibung ein

A. Kant
quelle
Ich habe diesen Fehler mit Swift 4 erhalten: Kann der Wert vom Typ '[String: Any]' nicht in den erwarteten Argumenttyp '[NSAttributedStringKey: Any] konvertiert werden?'
Pavlos
Das Setzen der letvorletzten Zeile führt zu einem Absturz in Xcode 9.1 fyi
Zack Shapiro
29

wenn Sie nach einer Möglichkeit suchen, dies ohne Vererbung zu tun -

schnell 3/4/5

// in swift 4 - switch NSUnderlineStyleAttributeName with NSAttributedStringKey.underlineStyle

extension 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
        }
    }
}
Shlomo Koppel
quelle
19

StoryBoard: Wenn Sie Text aus storyBoard unterstreichen möchten.

  • Wählen Sie die Schaltfläche oder den Beschriftungstitel als Attributiert aus.
  • Wählen Sie den Textbereich aus, den Sie unterstreichen möchten.
  • Klicken Sie mit der rechten Maustaste und wählen Sie Schriftart und dann Unterstreichen.

Geben Sie hier die Bildbeschreibung ein

Sukhwinder Singh
quelle
18

Basierend auf einigen früheren Antworten entscheide ich mich für eine Klasse, die einfach in Ihre Apps implementiert werden kann

Swift 4

import UIKit

class UnderlineTextButton: UIButton {

override func setTitle(_ title: String?, for state: UIControlState) {
    super.setTitle(title, for: .normal)
    self.setAttributedTitle(self.attributedString(), for: .normal)
}

private func attributedString() -> NSAttributedString? {
    let attributes : [NSAttributedStringKey : Any] = [
        NSAttributedStringKey.font : UIFont.systemFont(ofSize: 19.0),
        NSAttributedStringKey.foregroundColor : UIColor.red,
        NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue
    ]
    let attributedString = NSAttributedString(string: self.currentTitle!, attributes: attributes)
    return attributedString
  }
}

Vom Code nenne ich es so button.setTitle(author, for: .normal)

Max Tymchii
quelle
15

Vielen Dank, dass Sie Ihren Code veröffentlicht haben. Es war nicht klar, ob Sie überhaupt wissen, wie man eine zugeordnete Zeichenfolge erstellt.

Das sollte funktionieren:

var attrs = [
    NSFontAttributeName : UIFont.systemFontOfSize(19.0),
    NSForegroundColorAttributeName : UIColor.redColor(),
    NSUnderlineStyleAttributeName : NSUnderlineStyle.StyleSingle.rawValue
]

Swift 4 Version:

var attrs : [NSAttributedStringKey : Any] = [
    NSAttributedStringKey.font : UIFont.systemFont(ofSize: 19.0),
    NSAttributedStringKey.foregroundColor : UIColor.red,
    NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue
]
Glorfindel
quelle
Es stoppt zu biuld, wenn ich NSUnderlineStyleAttributeName hinzufüge: NSUnderlineStyle.StyleSingle
moonvader
Entschuldigung - ich habe einige Dinge zwischen ObjC und Swift verwechselt. Sie benötigen .rawValue
Glorfindel
Ich weiß nicht warum, aber die Tastenbezeichnung ändert sich nicht
Moonvader
@moonvader Wenn Sie mit einer Schaltfläche arbeiten, können Sie die Beschriftung nicht ändern, indem Sie direkt darauf zugreifen titleLabel. Vielmehr müssen Sie verwendenbutton.setAttributedTitle(attributedString, forState: .Normal)
Nathaniel Blumer
11

@ShlomoKoppel Antwort inSwift 4.2

extension 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 underlineMyText() {
        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
        }
    }
}
Kiran Jasvanee
quelle
6

Hier ist auf dem Storyboard fertig. (Xcode 9.1)

  1. Wählen Sie das Button-Objekt in Ihrer Ansicht aus.
  2. Öffnen Sie die Schriftarteneinstellungen

Geben Sie hier die Bildbeschreibung ein

  1. Wählen Sie Einzelne Unterstreichung

Geben Sie hier die Bildbeschreibung ein

  1. Geben Sie Ihren Text ein und drücken Sie die [Eingabetaste].
Chong Hann
quelle
1
Diese Option funktioniert nicht, wenn die Schriftart nicht auf dem Computer installiert ist. Wenn Sie dem Projekt eine benutzerdefinierte Schriftart hinzugefügt haben, diese jedoch nicht lokal installiert ist, wird die Schriftart nicht in den verfügbaren Optionen angezeigt.
B-Rad
4

Das ist meine Lösung. Und um ehrlich zu sein, brauchen Sie wahrscheinlich mehr als einen Ort, also erstellen wir eine Erweiterung. Das ist schnell 5.0 Prost :)

extension UIButton {
    func underline() {
        guard let title = self.titleLabel else { return }
        guard let tittleText = title.text else { return }
        let attributedString = NSMutableAttributedString(string: (tittleText))
        attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: (tittleText.count)))
        self.setAttributedTitle(attributedString, for: .normal)
    }
}

Und Sie können es so verwenden.

    override func viewDidLoad() {
     super.viewDidLoad()
     button.underline()
}
tBug
quelle
3
  • Swift 5.2.4
  • Xcode 11.5
let attributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.underlineStyle: 1,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13),
NSAttributedString.Key.foregroundColor: UIColor.systemGray3
]

let attributedString = NSMutableAttributedString(string: "Text here", attributes: attributes)
button.setAttributedTitle(NSAttributedString(attributedString: attributedString), for: .normal)
Hectorsvill
quelle
2

Für schnelle 5

var attrs : [NSAttributedString.Key : Any] = [
    NSAttributedString.Key.font : UIFont.systemFont(ofSize: 19.0),
    NSAttributedString.Key.foregroundColor : UIColor.blue,
    NSAttributedString.Key.underlineStyle : NSUnderlineStyle.styleSingle.rawValue
]
Talha Rasool
quelle
2

Eine modifizierte Version von @ shlomo-koppel antwortet auf den Schaltflächentitel. Es funktioniert, wenn Sie den Schaltflächentitel programmgesteuert festlegen / ändern (wie in meinem Fall habe ich die Lokalisierung verwendet).

extension UIButton {
    func underline() {
        guard let text = self.currentTitle else { return }
        let attributedString = NSMutableAttributedString(string: text)
        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)
    }
}
AshWinee Dhakad
quelle
1

Hier können Sie auch eine Unterstreichung und ein fett gedrucktes Gesicht hinzufügen. Sie können einfach eine Erweiterung in Ihre schnelle Klassendatei einfügen

Hier ist die Erweiterung (Swift 4 aktualisiert)

extension NSMutableAttributedString {
 @discardableResult func bold(_ text:String) -> NSMutableAttributedString {

      let attrs : [NSAttributedStringKey : Any] = [
        NSAttributedStringKey.font : UIFont(name: "Montserrat-Bold", size: 12)!,
        NSAttributedStringKey.foregroundColor : UIColor.white,
        NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue]
    let boldString = NSMutableAttributedString(string: text, attributes: attrs)
    self.append(boldString)
    return self
 }

 @discardableResult func normal(_ text:String)->NSMutableAttributedString {
      let attrs : [NSAttributedStringKey : Any] = [
        NSAttributedStringKey.font : UIFont(name: "Montserrat-Regular", size: 12)!,
        NSAttributedStringKey.foregroundColor : UIColor.white
    ]
    let normal =  NSAttributedString(string: text,  attributes:attrs)
    self.append(normal)
    return self
 }

}}

Sie können es so verwenden:

let FormattedText = NSMutableAttributedString()
      FormattedText
           .normal("By signing in, you agree with our ")
           .bold("Terms of Service")

yourLabel.attributedText = FormattedText

und das Ergebnis wird so angezeigt Geben Sie hier die Bildbeschreibung ein

Azharhussain Shaikh
quelle
0

Vielleicht nicht der beste Ansatz, aber ich habe ein Beispiel gemacht, um es mit einer getrennten Klasse zu verwenden und nur eine zu machen one line Aufruf zu machen, um den Text zu erhalten.

Hier ist meine Klasse:

import Foundation
import UIKit

enum AttributedTextsType {
    case underlined
    case bold
    case boldUnderlined
}

class AttributedTexts {
    private static func underlinedText(color: UIColor, size: CGFloat) -> [NSAttributedString.Key : Any] {
    let attrs = [
        NSAttributedString.Key.font : UIFont.systemFont(ofSize: size),
        NSAttributedString.Key.foregroundColor : color,
        NSAttributedString.Key.underlineStyle : 1] as [NSAttributedString.Key : Any]
    return attrs
    }

    private static func getAttibute(type: AttributedTextsType, color: UIColor, size: CGFloat) -> [NSAttributedString.Key : Any] {
        var attributes: [NSAttributedString.Key : Any]!
        switch type {
        case .underlined:
            attributes = AttributedTexts.underlinedText(color: color, size: size)
            break
        case .bold:
            attributes = AttributedTexts.underlinedText(color: color, size: size)
            break
        case .boldUnderlined:
            attributes = AttributedTexts.underlinedText(color: color, size: size)
            break
        }
        return attributes
    }

    static func set(string: String, color: UIColor, type: AttributedTextsType, size: CGFloat = 19.0) -> NSMutableAttributedString {
        let attributes = getAttibute(type: type, color: color, size: size)
        let attributedString = NSMutableAttributedString(string:"")
        let buttonTitleStr = NSMutableAttributedString(string: string, attributes: attributes)
        attributedString.append(buttonTitleStr)
        return attributedString
    }
}

Verwendung let attributedString = AttributedTexts.set(string: "Skip", color: .white, type: .underlined, size: 19.0)

Freundliche Grüße

Andres Paladines
quelle