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.
Antworten:
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) }
quelle
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) }
quelle
let
vorletzten Zeile führt zu einem Absturz in Xcode 9.1 fyiwenn 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 } } }
quelle
StoryBoard: Wenn Sie Text aus storyBoard unterstreichen möchten.
quelle
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)
quelle
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 ]
quelle
titleLabel
. Vielmehr müssen Sie verwendenbutton.setAttributedTitle(attributedString, forState: .Normal)
@ShlomoKoppel Antwort in
Swift 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 } } }
quelle
Hier ist auf dem Storyboard fertig. (Xcode 9.1)
quelle
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() }
quelle
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)
quelle
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 ]
quelle
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) } }
quelle
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
quelle
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
quelle