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.


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

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])

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

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

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



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 :)


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


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

`


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.")

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.


1

// Swift 4 Version

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

self.yourlabel.attributedText = attributedString

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

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


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

   }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.