Как быстро подчеркнуть UILabel?

99

Как подчеркнуть UILabelв Swift? Я искал Objective-C, но не смог заставить их работать в Swift.

Esqarrouth
источник
7
NSAttributedString?
Larme
что с дизлайками? здесь очевидная путаница с атрибутами, похожими на вызовы методов в objc
Esqarrouth,
здесь вы можете получить простой способ stackoverflow.com/questions/28268060/…
Kapil B
вот простой способ [ stackoverflow.com/questions/28268060/…
Kapil B

Ответы:

227

Вы можете сделать это с помощью NSAttributedString

Пример:

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

РЕДАКТИРОВАТЬ

Чтобы иметь одинаковые атрибуты для всех текстов одного UILabel, я предлагаю вам создать подкласс UILabel и переопределить текст, например:

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

И вы помещаете свой текст так:

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

СТАРЫЙ:

Swift (от 2,0 до 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
        }
    }
}
ХамзаГазуани
источник
Как лучше всего снять подчеркивание?
N. Der
Я давно задавался вопросом: почему мы должны использовать rawValue, иначе он выйдет из строя?
Бруно Мунис
UTF16При создании textRange вы должны передавать count вместо количества символовNSRange
Лео Дабус,
Я изменил это решение, чтобы добавить подчеркивание при инициализации, таким образом, мы можем легко использовать его с раскадровками required init?(coder: NSCoder) { super.init(coder: coder) self.addUnderline() // your code }
Жоао Серра
114

Swift 5 и 4.2 один лайнер:

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

Swift 4 однострочник:

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

Swift 3 один лайнер:

label.attributedText = NSAttributedString(string: "Text", attributes:
      [NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue])
хасан
источник
1
NSUnderlineStyle.styleSingle.rawValue был переименован в NSUnderlineStyle.single.rawValue в Свифт 4.2
скаалов
Как мне снять подчеркивание?
N. Der
@ N.Der Снова установите нормальный текст для метки
автор: Jevan
15

Если вы ищете способ сделать это без наследования:

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)
  }
}
Шломо Коппель
источник
Вы должны передать UTF16счетчик вместо счетчика символов при создании своегоNSRange
Лео Дабус
11

Swift 5:

1- Создайте расширение String для получения attributedText

extension String {

    var underLined: NSAttributedString {
        NSMutableAttributedString(string: self, attributes: [.underlineStyle: NSUnderlineStyle.single.rawValue])
    }

}

2- Используйте это

На кнопках:

button.setAttributedTitle(yourButtonTitle.underLined, for: .normal)

На этикетках:

label.attributedText = yourLabelTitle.underLined

Или версия Stoyboard

Алегелос
источник
8

Небольшое исправление для ответа Shlome в Swift 4 и 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)
        }
    }
Элано Васконселос
источник
Вы должны передать UTF16счетчик вместо счетчика символов при создании своегоNSRange
Лео Дабус
7

Вы можете подчеркнуть UILabelтекст, используя Интерфейсный Разработчик.

Вот ссылка на мой ответ: Добавление атрибута подчеркивания к частичному тексту UILabel в раскадровке

Ризван Шейх
источник
1
Этот метод не сработает, если повторно привязать текст к метке.
Eric H
@EricH Что ты имеешь в виду?
значение имеет значение
4

Тот же ответ в Swift 4.2

Для 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
        }
    }
}

Позвоните в UILabel, как показано ниже

myLable.underline()

Для 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)
        }

    }
}

Позвоните для UIButton, как показано ниже

myButton.underline()

Я просмотрел ответы выше, и некоторые из них - это принудительное развертывание текстового значения. Я предлагаю получить ценность, безопасно развернув. Это позволит избежать сбоя в случае нулевого значения. Надеюсь это поможет :)

Абдул Рехман
источник
просто красиво и легко
Ян Бергстрём
Вы должны передать UTF16счетчик вместо счетчика символов при создании своегоNSRange
Лео Дабус
Если у вас уже есть расширение для UILabel, IMO проще вызвать myButton.titleLabel? .Underline () или, по крайней мере, использовать его внутри функции подчеркивания () в расширении для UIButton.
Boherna
4

Swift 4, 4.2 и 5.

  @IBOutlet weak var lblUnderLine: UILabel!

Мне нужно подчеркнуть определенный текст в UILabel. Итак, найдите диапазон и установите атрибуты.

    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

Выход

введите описание изображения здесь

Гурджиндер Сингх
источник
3

Подчеркните несколько строк в предложении.

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

Используйте таким образом.

    lbl.text = "By continuing you agree to our Terms of Service and Privacy Policy."
    lbl.underlineMyText(range1: "Terms of Service", range2: "Privacy Policy.")
кальпеш
источник
1
Как будешь отслеживать тач?
karthikeyan
2

Swift 4 изменения. Не забудьте использовать NSUnderlineStyle.styleSingle.rawValue вместо NSUnderlineStyle.styleSingle .

   '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
источник
2

Вы также можете использовать это, если хотите получить только половину метки, как подчеркивание: - // Для 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
Випул Кумар
источник
1

Ответ выше вызывает ошибку в моей среде сборки.

Это не работает в Swift 4.0:

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

Попробуйте вместо этого:

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

надеюсь, это кому-то поможет.

Х. Тан
источник
1

// Версия Swift 4

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

self.yourlabel.attributedText = attributedString
iOS разработчик
источник
0

Для 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)
    }
}

и в ViewController

@IBOutlet var yourButton: UIButton!

в ViewDidLoadметоде или в своей функции просто напишите

yourButton.underline()

он подчеркнет заголовок вашей кнопки

Сайед Хаснайн
источник
0

Класс для установки и удаления подчеркивания для кнопок UI для Swift 5. Надеюсь, это поможет

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
источник