Wie unterstreiche ich schnell ein UILabel?

96

Wie unterstreiche ich ein UILabelin Swift? Ich habe die Objective-C durchsucht, konnte sie aber nicht dazu bringen, in Swift zu arbeiten.

Esqarrouth
quelle
7
NSAttributedString?
Larme
Was ist mit den Abneigungen? Es gibt hier eine offensichtliche Verwirrung mit den Attibuten, die wie Methodenaufrufe in objc
Esqarrouth
Hier können Sie den einfachen Weg bekommen stackoverflow.com/questions/28268060/…
Kapil B
Hier ist der einfache Weg [ stackoverflow.com/questions/28268060/…
Kapil B

Antworten:

221

Sie können dies mit NSAttributedString tun

Beispiel:

let underlineAttribute = [NSAttributedString.Key.underlineStyle: NSUnderlineStyle.thick.rawValue]
let underlineAttributedString = NSAttributedString(string: "StringWithUnderLine", attributes: underlineAttribute)
myLabel.attributedText = underlineAttributedString

BEARBEITEN

Um die gleichen Attribute für alle Texte eines UILabels zu haben, empfehle ich Ihnen, UILabel und überschreibenden Text wie folgt zu unterordnen:

Swift 4.2

class UnderlinedLabel: UILabel {

override var text: String? {
    didSet {
        guard let text = text else { return }
        let textRange = NSMakeRange(0, text.count)
        let attributedText = NSMutableAttributedString(string: text)
        attributedText.addAttribute(NSAttributedString.Key.underlineStyle , value: NSUnderlineStyle.single.rawValue, range: textRange)
        // Add other attributes if needed
        self.attributedText = attributedText
        }
    }
}

Swift 3.0

class UnderlinedLabel: UILabel {
    
    override var text: String? {
        didSet {
            guard let text = text else { return }
            let textRange = NSMakeRange(0, text.characters.count)
            let attributedText = NSMutableAttributedString(string: text)
            attributedText.addAttribute(NSUnderlineStyleAttributeName , value: NSUnderlineStyle.styleSingle.rawValue, range: textRange)
            // Add other attributes if needed
            self.attributedText = attributedText
        }
    }
}

Und Sie setzen Ihren Text so:

@IBOutlet weak var label: UnderlinedLabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        label.text = "StringWithUnderLine"
    }

ALT:

Schnell (2,0 bis 2,3):

class UnderlinedLabel: UILabel {
    
    override var text: String? {
        didSet {
            guard let text = text else { return }
            let textRange = NSMakeRange(0, text.characters.count)
            let attributedText = NSMutableAttributedString(string: text)
            attributedText.addAttribute(NSUnderlineStyleAttributeName, value:NSUnderlineStyle.StyleSingle.rawValue, range: textRange)
            // Add other attributes if needed
            
            self.attributedText = attributedText
        }
    }
}

Swift 1.2:

class UnderlinedLabel: UILabel {
    
    override var text: String! {
        didSet {
            let textRange = NSMakeRange(0, count(text))
            let attributedText = NSMutableAttributedString(string: text)
            attributedText.addAttribute(NSUnderlineStyleAttributeName, value:NSUnderlineStyle.StyleSingle.rawValue, range: textRange)
            // Add other attributes if needed
            
            self.attributedText = attributedText
        }
    }
}
HamzaGhazouani
quelle
Was wäre der beste Weg, um zu unterstreichen?
N. Der
Ich habe mich lange gefragt: Warum müssen wir rawValue verwenden, sonst stürzt es ab?
Bruno Muniz
Sie sollten UTF16beim Erstellen Ihres TextbereichsNSRange
Leo Dabus
112

Swift 5 & 4.2 Einzeiler:

label.attributedText = NSAttributedString(string: "Text", attributes:
    [.underlineStyle: NSUnderlineStyle.single.rawValue])

Swift 4 Einzeiler:

label.attributedText = NSAttributedString(string: "Text", attributes:
    [.underlineStyle: NSUnderlineStyle.styleSingle.rawValue])

Swift 3 One Liner:

label.attributedText = NSAttributedString(string: "Text", attributes:
      [NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue])
hasan
quelle
1
NSUnderlineStyle.styleSingle.rawValue wurde in Swift 4.2
Skaal
Wie unterstreiche ich?
N. Der
@ N.Der Setze wieder einen normalen Text zum Beschriften
Jeevan
15

Wenn Sie nach einer Möglichkeit suchen, dies ohne Vererbung zu tun:

Swift 5

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))
          attributedText = attributedString
        }
    }
}

Swift 3/4

// in swift 4 - switch NSUnderlineStyleAttributeName with NSAttributedStringKey.underlineStyle
extension UILabel {
    func underline() {
        if let textString = self.text {
          let attributedString = NSMutableAttributedString(string: textString)
          attributedString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: NSRange(location: 0, length: attributedString.length))
          attributedText = attributedString
        }
    }
}


extension UIButton {
  func underline() {
    let attributedString = NSMutableAttributedString(string: (self.titleLabel?.text!)!)
    attributedString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: NSRange(location: 0, length: (self.titleLabel?.text!.characters.count)!))
    self.setAttributedTitle(attributedString, for: .normal)
  }
}
Shlomo Koppel
quelle
Sie sollten die UTF16Anzahl anstelle der Anzahl der Zeichen übergeben, wenn Sie IhrenNSRange
Leo Dabus
8

Nur eine kleine Korrektur für die Shlome-Antwort in Swift 4 und Xcode 9 .

extension UILabel {
    func underline() {
        if let textString = self.text {
            let attributedString = NSMutableAttributedString(string: textString)
            attributedString.addAttribute(NSAttributedStringKey.underlineStyle,
                                          value: NSUnderlineStyle.styleSingle.rawValue,
                                          range: NSRange(location: 0, length: attributedString.length - 1))
            attributedText = attributedString
        }
    }
}

    extension UIButton {
        func underline() {
            let attributedString = NSMutableAttributedString(string: (self.titleLabel?.text!)!)
            attributedString.addAttribute(NSAttributedStringKey.underlineStyle,
                                          value: NSUnderlineStyle.styleSingle.rawValue,
                                          range: NSRange(location: 0, length: (self.titleLabel?.text!.count)!))
            self.setAttributedTitle(attributedString, for: .normal)
        }
    }
Elano Vasconcelos
quelle
Sie sollten die UTF16Anzahl anstelle der Anzahl der Zeichen übergeben, wenn Sie IhrenNSRange
Leo Dabus
8

Swift 4:

1- Erstellen Sie eine String-Erweiterung, um den Attributtext zu erhalten.

2- Verwenden Sie es

Erweiterung:

import UIKit
extension String {
   func getUnderLineAttributedText() -> NSAttributedString {
       return NSMutableAttributedString(string: self, attributes: [.underlineStyle: NSUnderlineStyle.styleSingle.rawValue])
   }
}

Wie man es auf Button benutzt:

if let title = button.titleLabel?.text{
    button.setAttributedTitle(title.getUnderLineAttributedText(), for: .normal)
}

So verwenden Sie es auf Etiketten:

if let title = label.text{    
   label.attributedText = title.getUnderLineAttributedText()
}

Oder Stoyboard-Version

Alegelos
quelle
4

Gleiche Antwort in Swift 4.2

Für UILable

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: textString.count))
            self.attributedText = attributedString
        }
    }
}

Fordern Sie UILabel wie unten an

myLable.underline()

Für UIButton

extension UIButton {
    func underline() {
        if let textString = self.titleLabel?.text {

            let attributedString = NSMutableAttributedString(string: textString)
            attributedString.addAttribute(NSAttributedString.Key.underlineStyle,
                                          value: NSUnderlineStyle.single.rawValue,
                                          range: NSRange(location: 0, length: textString.count))
            self.setAttributedTitle(attributedString, for: .normal)
        }

    }
}

Rufen Sie nach UIButton wie unten

myButton.underline()

Ich sah in über Antworten und einige von ihnen sind Kraft Abwickeln Text Wert. Ich werde vorschlagen, Wert durch sicheres Auspacken zu erhalten. Dies verhindert einen Absturz bei einem Wert von Null. Hoffe das hilft :)

Abdul Rehman
quelle
einfach schön und einfach
Jan Bergström
Sie sollten passieren UTF16Zahl anstelle der Zeichenanzahl , wenn die ErstellungNSRange
Leo Dabus
Wenn Sie die Erweiterung für UILabel, IMO, bereits haben, ist es einfacher, myButton.titleLabel? .Underline () aufzurufen oder zumindest innerhalb der Funktion underline () in der Erweiterung für UIButton zu verwenden.
Boherna
4

Swift 4, 4.2 und 5.

  @IBOutlet weak var lblUnderLine: UILabel!

Ich muss bestimmten Text in UILabel unterstreichen. Finden Sie also den Bereich und legen Sie die Attribute fest.

    let strSignup = "Don't have account? SIGNUP NOW."
    let rangeSignUp = NSString(string: strSignup).range(of: "SIGNUP NOW.", options: String.CompareOptions.caseInsensitive)
    let rangeFull = NSString(string: strSignup).range(of: strSignup, options: String.CompareOptions.caseInsensitive)
    let attrStr = NSMutableAttributedString.init(string:strSignup)
    attrStr.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.white,
                           NSAttributedString.Key.font : UIFont.init(name: "Helvetica", size: 17)! as Any],range: rangeFull)
    attrStr.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.white,
                           NSAttributedString.Key.font : UIFont.init(name: "Helvetica", size: 20)!,
                          NSAttributedString.Key.underlineStyle: NSUnderlineStyle.thick.rawValue as Any],range: rangeSignUp) // for swift 4 -> Change thick to styleThick
    lblUnderLine.attributedText = attrStr

Ausgabe

Geben Sie hier die Bildbeschreibung ein

Gurjinder Singh
quelle
2

Schnelle 4 Änderungen. Denken Sie daran, NSUnderlineStyle.styleSingle.rawValue anstelle von NSUnderlineStyle.styleSingle zu verwenden .

   'let attributedString = NSAttributedString(string: "Testing")
    let textRange = NSMakeRange(0, attributedString.length)
    let underlinedMessage = NSMutableAttributedString(attributedString: attributedString)
    underlinedMessage.addAttribute(NSAttributedStringKey.underlineStyle,
                                   value:NSUnderlineStyle.styleSingle.rawValue,
                                   range: textRange)
    label.attributedText = underlinedMessage

`

venky
quelle
2

Unterstreichen Sie mehrere Zeichenfolgen in einem Satz.

extension UILabel {
    func underlineMyText(range1:String, range2:String) {
        if let textString = self.text {

            let str = NSString(string: textString)
            let firstRange = str.range(of: range1)
            let secRange = str.range(of: range2)
            let attributedString = NSMutableAttributedString(string: textString)
            attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: firstRange)
            attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: secRange)
            attributedText = attributedString
        }
    }
}

Verwenden Sie auf diese Weise.

    lbl.text = "By continuing you agree to our Terms of Service and Privacy Policy."
    lbl.underlineMyText(range1: "Terms of Service", range2: "Privacy Policy.")
Kalpesh
quelle
1
Wie werden Sie die Berührung verfolgen?
Karthikeyan
1

Die obige Antwort verursacht einen Fehler in meiner Build-Umgebung.

Dies funktioniert in Swift 4.0 nicht:

attributedText.addAttribute(NSUnderlineStyleAttributeName, 
                            value: NSUnderlineStyle.styleSingle.rawValue, 
                            range: textRange)

Versuchen Sie stattdessen Folgendes:

attributedText.addAttribute(NSAttributedStringKey.underlineStyle,
                            value: NSUnderlineStyle.styleSingle.rawValue,
                            range: textRange)

hoffe das hilft jemandem.

H. Tan
quelle
1

// Swift 4 Version

 let attributedString  = NSMutableAttributedString(string: "Your Text Here", attributes: [NSAttributedStringKey.underlineStyle : true])

self.yourlabel.attributedText = attributedString
iOS-Entwickler
quelle
1

Sie können dies auch verwenden, wenn Sie nur den halben Teil des Etiketts als Unterstreichung erzielen möchten: - // Für Swift 4.0+

let attributesForUnderLine: [NSAttributedString.Key: Any] = [
            .font: UIFont(name: AppFont.sourceSansPro_Regular, size: 12) ?? UIFont.systemFont(ofSize: 11),
            .foregroundColor: UIColor.blue,
            .underlineStyle: NSUnderlineStyle.single.rawValue]

        let attributesForNormalText: [NSAttributedString.Key: Any] = [
            .font: UIFont(name: AppFont.sourceSansPro_Regular, size: 12) ?? UIFont.systemFont(ofSize: 11),
            .foregroundColor: AppColors.ColorText_787878]

        let textToSet = "Want to change your preferences? Edit Now"
        let rangeOfUnderLine = (textToSet as NSString).range(of: "Edit Now")
        let rangeOfNormalText = (textToSet as NSString).range(of: "Want to change your preferences?")

        let attributedText = NSMutableAttributedString(string: textToSet)
        attributedText.addAttributes(attributesForUnderLine, range: rangeOfUnderLine)
        attributedText.addAttributes(attributesForNormalText, range: rangeOfNormalText)
        yourLabel.attributedText = attributedText
Vipul Kumar
quelle
0

Für Swift 2.3

extension UIButton {
    func underline() {
        let attributedString = NSMutableAttributedString(string: (self.titleLabel?.text!)!)
        attributedString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: NSRange(location: 0, length: (self.titleLabel?.text!.characters.count)!))
        self.setAttributedTitle(attributedString, forState: .Normal)
    }
}

und in ViewController

@IBOutlet var yourButton: UIButton!

in ViewDidLoadMethode oder in Ihrer Funktion schreiben Sie einfach

yourButton.underline()

Es wird den Titel Ihrer Schaltfläche unterstreichen

Syed Hasnain
quelle
0

Eine Klasse zum Setzen und Entfernen von Unterstreichungen für UIbuttons für Swift 5. Ich hoffe, dies hilft

import Foundation
   import UIKit

   class UiUtil {

       static let underlineThickness = 2
    
       class func removeUnderlineFromButton( _ button:UIButton ) {
          if let str = button.titleLabel?.attributedText {
            let attributedString = NSMutableAttributedString( attributedString: str )
            attributedString.removeAttribute(.underlineStyle, range: 
   NSRange.init(location: 0, length: attributedString.length))
            button.setAttributedTitle(attributedString, for: .normal)
         }
      }

    class func setUnderlineFromButton( _ button:UIButton ) {
        if let str = button.titleLabel?.attributedText {
            let attributedStringUnderline = NSMutableAttributedString( attributedString: 
    str  )
              attributedStringUnderline.addAttribute(
                NSAttributedString.Key.underlineStyle,
                value: underlineThickness,
                range: NSRange.init(location: 0, length: attributedStringUnderline.length)
              )
              button.setAttributedTitle(attributedStringUnderline, for: .normal)
           }
      }

   }
Wil
quelle