कैसे तेजी से एक UILabel को रेखांकित करने के लिए?


96

UILabelस्विफ्ट में अंडरलाइन कैसे करें ? मैंने ऑब्जेक्टिव-सी खोजा, लेकिन स्विफ्ट में काम करने के लिए उन्हें बहुत कुछ नहीं मिला।


7
NSAttributedString?
लार्मे

नापसंद के साथ क्या? यहाँ एक स्पष्ट भ्रम है कि अटबी में विधि कॉल की तरह दिखने वाले एटिट्यूड
एसकर्राउथ

यहाँ आप आसान तरीका stackoverflow.com/questions/28268060/…
कपिल बी

यहाँ आसान तरीका है [ stackoverflow.com/questions/28268060/…
कपिल बी

जवाबों:


221

आप NSAttributedString का उपयोग करके ऐसा कर सकते हैं

उदाहरण:

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

संपादित करें

एक यूआईबेल के सभी पाठों के लिए समान विशेषताएँ होने के लिए, मैं आपको यूआईबेल को उप-पाठ करने और पाठ को ओवरराइड करने का सुझाव देता हूं, जैसे:

स्विफ्ट 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
        }
    }
}

स्विफ्ट 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"
    }

पुराना:

स्विफ्ट (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
        }
    }
}

स्विफ्ट 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
        }
    }
}

डी-अंडरलाइन करने का सबसे अच्छा तरीका क्या होगा?
एन। डेर

मैं एक लंबे समय के लिए सोच रहा था: हमें कच्चे माल का उपयोग क्यों करना पड़ता है अन्यथा यह दुर्घटनाग्रस्त हो जाता है?
ब्रूनो मुनिज़

UTF16चरित्र पाठ के स्थान पर आपको गिनती करनी चाहिए जब आप अपना टेक्स्ट रेंगते हैंNSRange
लियो डबस

112

स्विफ्ट 5 और 4.2 एक लाइनर:

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

स्विफ्ट 4 एक लाइनर:

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

स्विफ्ट 3 एक लाइनर:

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

1
NSUnderlineStyle.styleSingle.rawValue का नाम बदलकर NSUnderlineStyle.single.rawle.raw स्विफ्ट 4.2 हो गया है
Skaal

मैं डी-अंडरलाइन कैसे करूं?
एन। डेर

@ N.Der फिर से एक सामान्य पाठ को लेबल पर सेट करें
byJeevan

15

यदि आप विरासत के बिना ऐसा करने के लिए रास्ता तलाश रहे हैं:

स्विफ्ट 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
        }
    }
}

स्विफ्ट 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
लियो डबस

8

स्विफ्ट 4 और एक्सकोड 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
लियो डबस

8

स्विफ्ट 4:

1- आरटेटटेक्स्ट प्राप्त करने के लिए एक स्ट्रिंग एक्सटेंशन बनाएं

2- इसका प्रयोग करें

एक्सटेंशन:

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

बटटन पर इसका उपयोग कैसे करें:

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

लेबल पर इसका उपयोग कैसे करें:

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

या स्टॉयबोर्ड संस्करण


7

आप UILabelइंटरफ़ेस बिल्डर का उपयोग करके पाठ को रेखांकित कर सकते हैं ।

यहाँ मेरे उत्तर की लिंक दी गई है: स्टोरीबोर्ड में आंशिक पाठ UILabel में अंडरलाइन विशेषता जोड़ना


1
यह विधि विफल हो जाती है यदि आप पाठ को लेबल से रिबंड करते हैं।
एरिक एच।

@ EricH तुम्हारा क्या मतलब है?
अर्थ-मामले

4

उसी में उत्तर स्विफ्ट 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()

मैंने उपरोक्त उत्तरों पर ध्यान दिया और उनमें से कुछ पाठ मूल्य को बल देने वाले हैं । मैं सुरक्षित रूप से अपरिवर्तित होकर मूल्य प्राप्त करने का सुझाव दूंगा। यह शून्य मान के मामले में दुर्घटना से बचाएगा। उम्मीद है की यह मदद करेगा :)


बस सतर्क और आसान
Jan Bergström

UTF16चरित्र गिनती के बजाय आपको गिनती पास करनी चाहिए जब आपकाNSRange
लियो डबस

यदि आपके पास पहले से ही UILabel के लिए एक्सटेंशन है, तो IMO myButton.titleLabel? (.Underline) को कॉल करना सरल है, या कम से कम इसे UIButton के एक्सटेंशन में अंडरलाइन () फ़ंक्शन के अंदर उपयोग करें।
बोहेनरा

4

स्विफ्ट 4, 4.2 और 5।

  @IBOutlet weak var lblUnderLine: 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
आप स्पर्श को कैसे ट्रैक करेंगे?
कार्तिकेयन

2

स्विफ्ट 4 परिवर्तन। NSUnderlineStyle.styleSingle के बजाय NSUnderlineStyle.styleSingle.rawValue का उपयोग करने के लिए रिमाइबर

   '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

ऊपर दिया गया उत्तर मेरे बिल्ड वातावरण में त्रुटि पैदा कर रहा है।

यह स्विफ्ट 4.0 में काम नहीं करता है:

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

इसके बजाय यह प्रयास करें:

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

आशा है कि यह किसी की मदद करता है।


1

// स्विफ्ट 4 संस्करण

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

self.yourlabel.attributedText = attributedString

1

यदि आप लेबल के केवल आधे भाग को भी रेखांकित करना चाहते हैं तो आप इसका उपयोग कर सकते हैं: - // 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

स्विफ्ट 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

Swift 5 के लिए UIbuttons के लिए अंडरलाइन और सेट करने के लिए एक वर्ग। मुझे आशा है कि यह मदद करता है

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

   }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.