Làm thế nào để gạch dưới một Nhãn UIL nhanh chóng?


96

Làm thế nào để gạch dưới một UILabeltrong Swift? Tôi đã tìm kiếm những cái Objective-C nhưng không thể làm cho chúng hoạt động được trong Swift.


7
NSAttributedString?
Larme

có gì với những điều không thích? có một sự nhầm lẫn rõ ràng ở đây với attibutes trông như các cuộc gọi phương pháp trong objc
Esqarrouth

ở đây bạn có thể có được một cách dễ dàng stackoverflow.com/questions/28268060/...
Kapil B

đây là cách dễ dàng [ stackoverflow.com/questions/28268060/…
Kapil B

Câu trả lời:


222

Bạn có thể thực hiện việc này bằng NSAttributedString

Thí dụ:

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

BIÊN TẬP

Để có các thuộc tính giống nhau cho tất cả các văn bản của một UILabel, tôi khuyên bạn nên phân lớp UILabel và ghi đè văn bản, như sau:

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

Và bạn đặt văn bản của bạn như thế này:

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

CŨ:

Swift (2.0 đến 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
        }
    }
}

Cách tốt nhất để gạch chân là gì?
N. Der

Tôi đã tự hỏi trong một thời gian dài: tại sao chúng ta phải sử dụng rawValue nếu không nó bị treo?
Bruno Muniz

Bạn nên chuyển UTF16số lượng thay vì số lượng ký tự khi tạo văn bản của bạnRangeNSRange
Leo Dabus

113

Swift 5 & 4.2 một lớp lót:

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

Swift 4 một lớp lót:

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

Swift 3 một lớp lót:

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

1
NSUnderlineStyle.styleSingle.rawValue đã được đổi tên thành NSUnderlineStyle.single.rawValue trong nhanh chóng 4.2
Skaal

Làm cách nào để xóa gạch chân?
N. Der

@ N.Der Set lại một văn bản bình thường để nhãn
byJeevan

15

Nếu bạn đang tìm cách thực hiện việc này mà không cần kế thừa:

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

Bạn nên vượt qua UTF16số lượng thay vì số lượng ký tự khi tạo của bạnNSRange
Leo Dabus

8

Chỉ cần sửa một chút cho câu trả lời Shlome trong Swift 4Xcode 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)
        }
    }

Bạn nên vượt qua UTF16số lượng thay vì số lượng ký tự khi tạo của bạnNSRange
Leo Dabus

8

Swift 4:

1- Tạo một tiện ích mở rộng Chuỗi để nhận Văn bản phân bổ.

2- Sử dụng

Sự mở rộng:

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

Cách sử dụng nó trên buttton:

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

Cách sử dụng nó trên Nhãn:

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

Hoặc phiên bản Stoyboard



4

Câu trả lời tương tự trong Swift 4.2

Đối với 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
        }
    }
}

Gọi cho UILabel như bên dưới

myLable.underline()

Đối với 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)
        }

    }
}

Gọi cho UIButton như bên dưới

myButton.underline()

Tôi đã xem xét các câu trả lời ở trên và một số trong số đó đang buộc mở giá trị văn bản . Tôi sẽ đề xuất để có được giá trị bằng cách mở gói một cách an toàn. Điều này sẽ tránh sự cố trong trường hợp giá trị nil. Hi vọng điêu nay co ich :)


đơn giản và dễ dàng beutiful
Jan Bergström

Bạn nên vượt qua UTF16số lượng thay vì số lượng ký tự khi tạo của bạnNSRange
Leo Dabus

Nếu bạn đã có tiện ích mở rộng cho UILabel, IMO thì sẽ đơn giản hơn khi gọi myButton.titleLabel? .Underline (), hoặc ít nhất là sử dụng nó bên trong hàm underline () trong tiện ích mở rộng cho UIButton.
boherna

4

Swift 4, 4.2 và 5.

  @IBOutlet weak var lblUnderLine: UILabel!

Tôi cần gạch dưới văn bản cụ thể trong UILabel. Vì vậy, hãy tìm phạm vi và đặt thuộc tính.

    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

Đầu ra

nhập mô tả hình ảnh ở đây


3

Gạch chân đến nhiều chuỗi trong một câu.

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

Sử dụng theo cách này.

    lbl.text = "By continuing you agree to our Terms of Service and Privacy Policy."
    lbl.underlineMyText(range1: "Terms of Service", range2: "Privacy Policy.")

1
Làm thế nào bạn sẽ theo dõi các liên lạc?
karthikeyan

2

Swift 4 thay đổi. Hãy nhớ sử dụng NSUnderlineStyle.styleSingle.rawValue thay vì 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

`


1

Câu trả lời ở trên đang gây ra lỗi trong môi trường xây dựng của tôi.

Điều này không hoạt động trong Swift 4.0:

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

Hãy thử cái này thay thế:

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

hy vọng điều này sẽ giúp ai đó.


1

// Phiên bản Swift 4

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

self.yourlabel.attributedText = attributedString

1

Bạn cũng có thể sử dụng điều này nếu bạn chỉ muốn đạt được một nửa của nhãn dưới dạng gạch dưới: - // Đối với 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

Đối với 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)
    }
}

và trong ViewController

@IBOutlet var yourButton: UIButton!

trong ViewDidLoadMethod hoặc trong hàm của bạn, chỉ cần viết

yourButton.underline()

nó sẽ gạch dưới tiêu đề nút của bạn


0

Một lớp để đặt và xóa gạch chân cho các nút giao diện người dùng cho Swift 5. Tôi hy vọng điều này sẽ giúp

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

   }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.