Come posso creare un'etichetta UIL con testo barrato?


121

Voglio creare un UILabelin cui il testo sia così

inserisci qui la descrizione dell'immagine

Come posso fare questo? Quando il testo è piccolo, anche la linea dovrebbe essere piccola.



Se hai solo bisogno del supporto per iOS 6, puoi farlo con un NSAttributedStringe la UILabel attributedTextproprietà.
rmaddy

è possibile annullare l'annullamento del testo del pulsante
SCS

Risposte:


221

CODICE DI AGGIORNAMENTO SWIFT 4

let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: "Your Text")
    attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: 2, range: NSMakeRange(0, attributeString.length))

poi:

yourLabel.attributedText = attributeString

Per fare in modo che una parte della corda colpisca, fornire la portata

let somePartStringRange = (yourStringHere as NSString).range(of: "Text")
attributeString.addAttribute(NSStrikethroughStyleAttributeName, value: 2, range: somePartStringRange)

Objective-C

In iOS 6.0> UILabel supportaNSAttributedString

NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:@"Your String here"];
[attributeString addAttribute:NSStrikethroughStyleAttributeName
                        value:@2
                        range:NSMakeRange(0, [attributeString length])];

veloce

let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: "Your String here")
attributeString.addAttribute(NSStrikethroughStyleAttributeName, value: 2, range: NSMakeRange(0, attributeString.length))

Definizione :

- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)aRange

Parameters List:

nome : una stringa che specifica il nome dell'attributo. Le chiavi degli attributi possono essere fornite da un altro framework o possono essere personalizzate definite dall'utente. Per informazioni su dove trovare le chiavi degli attributi fornite dal sistema, vedere la sezione panoramica in Riferimento alla classe NSAttributedString.

valore : il valore dell'attributo associato al nome.

aRange : l'intervallo di caratteri a cui si applica la coppia attributo / valore specificata.

Poi

yourLabel.attributedText = attributeString;

Perché lesser than iOS 6.0 versionsdevi 3-rd party componentfarlo. Uno di questi è TTTAttributedLabel , un altro è OHAttributedLabel .


Per la versione inferiore di iOS 5.1.1 come posso utilizzare l'etichetta attribuita a 3 parti per visualizzare il testo attribuito:?
Dev

Puoi suggerirmi un buon Toutorial? Il link che hai fornito è un po 'difficile da capire .. :(
Dev

Puoi spiegare cosa dovrei fare per creare un'etichetta attribuita a terze parti per ios
Dev

Cos'è @ 2? Numero magico?
Ben Sinclair

7
Immagino ti sia dimenticato di commetterlo. È necessario utilizzare un valore appropriato da NSUnderlineStyle invece di @ 2. Sono un po 'pedante qui.
Ben Sinclair

45

In Swift, utilizzando l'enumerazione per uno stile di linea barrato:

let attrString = NSAttributedString(string: "Label Text", attributes: [NSStrikethroughStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue])
label.attributedText = attrString

Stili barrati aggiuntivi ( ricordarsi di accedere all'enumerazione utilizzando .rawValue ):

  • NSUnderlineStyle.StyleNone
  • NSUnderlineStyle.StyleSingle
  • NSUnderlineStyle.StyleThick
  • NSUnderlineStyle.StyleDouble

Schemi barrati (da modificare OR con lo stile):

  • NSUnderlineStyle.PatternDot
  • NSUnderlineStyle.PatternDash
  • NSUnderlineStyle.PatternDashDot
  • NSUnderlineStyle.PatternDashDotDot

Specifica che il barrato deve essere applicato solo tra le parole (non gli spazi):

  • NSUnderlineStyle.ByWord

1
Up ha votato per usare la costante giusta invece di un numero
Mihai Fratu

36

Preferisco NSAttributedStringpiuttosto che NSMutableAttributedStringper questo semplice caso:

NSAttributedString * title =
    [[NSAttributedString alloc] initWithString:@"$198"
                                    attributes:@{NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle)}];
[label setAttributedText:title];

Costanti per specificare sia le NSUnderlineStyleAttributeNamee NSStrikethroughStyleAttributeNamegli attributi di una stringa attribuiti:

typedef enum : NSInteger {  
  NSUnderlineStyleNone = 0x00,  
  NSUnderlineStyleSingle = 0x01,  
  NSUnderlineStyleThick = 0x02,  
  NSUnderlineStyleDouble = 0x09,  
  NSUnderlinePatternSolid = 0x0000,  
  NSUnderlinePatternDot = 0x0100,  
  NSUnderlinePatternDash = 0x0200,  
  NSUnderlinePatternDashDot = 0x0300,  
  NSUnderlinePatternDashDotDot = 0x0400,  
  NSUnderlineByWord = 0x8000  
} NSUnderlineStyle;  

27

Barrato in Swift 5.0

let attributeString =  NSMutableAttributedString(string: "Your Text")
attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle,
                                     value: NSUnderlineStyle.single.rawValue,
                                         range: NSMakeRange(0, attributeString.length))
self.yourLabel.attributedText = attributeString

Ha funzionato per me come un fascino.

Usalo come estensione

extension String {
    func strikeThrough() -> NSAttributedString {
        let attributeString =  NSMutableAttributedString(string: self)
        attributeString.addAttribute(
            NSAttributedString.Key.strikethroughStyle,
               value: NSUnderlineStyle.single.rawValue,
                   range:NSMakeRange(0,attributeString.length))
        return attributeString
    }
}

Chiama così

myLabel.attributedText = "my string".strikeThrough()

Estensione UILabel per barrato Abilita / Disabilita.

extension UILabel {

func strikeThrough(_ isStrikeThrough:Bool) {
    if isStrikeThrough {
        if let lblText = self.text {
            let attributeString =  NSMutableAttributedString(string: lblText)
            attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: NSUnderlineStyle.single.rawValue, range: NSMakeRange(0,attributeString.length))
            self.attributedText = attributeString
        }
    } else {
        if let attributedStringText = self.attributedText {
            let txt = attributedStringText.string
            self.attributedText = nil
            self.text = txt
            return
        }
    }
    }
}

Usalo in questo modo:

   yourLabel.strikeThrough(btn.isSelected) // true OR false

Ti è capitato di conoscere una soluzione per non rimuovere StrikeThrough? Simile a forums.developer.apple.com/thread/121366
JeroenJK

23

CODICE SWIFT

let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: "Your Text")
    attributeString.addAttribute(NSStrikethroughStyleAttributeName, value: 2, range: NSMakeRange(0, attributeString.length))

poi:

yourLabel.attributedText = attributeString

Grazie alla risposta di Prince ;)


15

SWIFT 4

    let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: "Your Text Goes Here")
    attributeString.addAttribute(NSAttributedStringKey.strikethroughStyle, value: NSUnderlineStyle.styleSingle.rawValue, range: NSMakeRange(0, attributeString.length))
    self.lbl_productPrice.attributedText = attributeString

Un altro metodo consiste nell'usare String Extension
Extension

extension String{
    func strikeThrough()->NSAttributedString{
        let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: self)
        attributeString.addAttribute(NSAttributedStringKey.strikethroughStyle, value: NSUnderlineStyle.styleSingle.rawValue, range: NSMakeRange(0, attributeString.length))
        return attributeString
    }
}

Chiamare la funzione: l' ho usata così

testUILabel.attributedText = "Your Text Goes Here!".strikeThrough()

Ringraziamo @Yahya - aggiornamento dicembre 2017
Ringraziamo @kuzdu - aggiornamento agosto 2018


Non funziona per me. La risposta di Purnendu Roy funziona per me. L'unica differenza è che si passa value 0e si passa value: NSUnderlineStyle.styleSingle.rawValue
Purnendu

@kuzdu cosa divertente che la mia risposta fosse nel dicembre 2017 funziona allora ha appena copiato il mio codice e aggiunto NSUnderlineStyle.styleSingle.rawValue ^ - ^ Ma nessun problema aggiornerò questa risposta solo per renderti felice
Muhammad Asyraf

9

Puoi farlo in IOS 6 usando NSMutableAttributedString.

NSMutableAttributedString *attString=[[NSMutableAttributedString alloc]initWithString:@"$198"];
[attString addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInt:2] range:NSMakeRange(0,[attString length])];
yourLabel.attributedText = attString;

8

Barrare il testo UILabel in Swift iOS. Per favore prova questo funziona per me

let attributedString = NSMutableAttributedString(string:"12345")
                      attributedString.addAttribute(NSAttributedStringKey.baselineOffset, value: 0, range: NSMakeRange(0, attributedString.length))
                      attributedString.addAttribute(NSAttributedStringKey.strikethroughStyle, value: NSNumber(value: NSUnderlineStyle.styleThick.rawValue), range: NSMakeRange(0, attributedString.length))
                      attributedString.addAttribute(NSAttributedStringKey.strikethroughColor, value: UIColor.gray, range: NSMakeRange(0, attributedString.length))

 yourLabel.attributedText = attributedString

Puoi cambiare il tuo "strikethroughStyle" come styleSingle, styleThick, styleDouble inserisci qui la descrizione dell'immagine


5

Swift 5

extension String {

  /// Apply strike font on text
  func strikeThrough() -> NSAttributedString {
    let attributeString = NSMutableAttributedString(string: self)
    attributeString.addAttribute(
      NSAttributedString.Key.strikethroughStyle,
      value: 1,
      range: NSRange(location: 0, length: attributeString.length))

      return attributeString
     }
   }

Esempio:

someLabel.attributedText = someText.strikeThrough()

Differenza tra valore: 1 e valore: 2
iOS

2
Il valore @iOS è lo spessore della linea barrata nel testo. Maggiore è il valore, più spessa è la linea che attraversa il testo
Vladimir Pchelyakov

4

Per chiunque stia cercando come farlo in una cella tableview (Swift) devi impostare .attributeText in questo modo:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("TheCell")!

    let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: message)
    attributeString.addAttribute(NSStrikethroughStyleAttributeName, value: 2, range: NSMakeRange(0, attributeString.length))

    cell.textLabel?.attributedText =  attributeString

    return cell
    }

Se vuoi rimuovere il barrato, fallo altrimenti rimarrà in giro !:

cell.textLabel?.attributedText =  nil

2

Swift 4.2

let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: product.price)

attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: NSUnderlineStyle.single.rawValue, range: NSMakeRange(0, attributeString.length))

lblPrice.attributedText = attributeString

2

Potrei essere in ritardo alla festa.

Ad ogni modo, sono a conoscenza del NSMutableAttributedStringma recentemente ho ottenuto la stessa funzionalità con un approccio leggermente diverso.

  • Ho aggiunto UIView con altezza = 1.
  • Corrisponde ai vincoli iniziali e finali di UIView con i vincoli iniziali e finali dell'etichetta
  • Allineata la vista UIV al centro dell'etichetta

Dopo aver seguito tutti i passaggi precedenti, la mia etichetta, UIView e i suoi vincoli apparivano come nell'immagine sottostante.

inserisci qui la descrizione dell'immagine


soluzione intelligente 👍
Dania Delbani

1

Usa il codice sottostante

NSString* strPrice = @"£399.95";

NSMutableAttributedString *titleString = [[NSMutableAttributedString alloc] initWithString:strPrice];

[finalString addAttribute: NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger: NSUnderlineStyleSingle] range: NSMakeRange(0, [titleString length])];
self.lblOldPrice.attributedText = finalString;   

1

Modificare la proprietà del testo in attribuito e selezionare il testo e fare clic con il tasto destro per ottenere la proprietà del carattere. Fare clic sul barrato. Immagine dello schermo


0

Per coloro che affrontano problemi con lo sciopero del testo su più righe

    let attributedString = NSMutableAttributedString(string: item.name!)
    //necessary if UILabel text is multilines
    attributedString.addAttribute(NSBaselineOffsetAttributeName, value: 0, range: NSMakeRange(0, attributedString.length))
     attributedString.addAttribute(NSStrikethroughStyleAttributeName, value: NSNumber(value: NSUnderlineStyle.styleSingle.rawValue), range: NSMakeRange(0, attributedString.length))
    attributedString.addAttribute(NSStrikethroughColorAttributeName, value: UIColor.darkGray, range: NSMakeRange(0, attributedString.length))

    cell.lblName.attributedText = attributedString

0

Crea l'estensione String e aggiungi sotto il metodo

static func makeSlashText(_ text:String) -> NSAttributedString {


 let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: text)
        attributeString.addAttribute(NSStrikethroughStyleAttributeName, value: 2, range: NSMakeRange(0, attributeString.length))

return attributeString 

}

quindi usa per la tua etichetta in questo modo

yourLabel.attributedText = String.makeSlashText("Hello World!")

0

Questo è quello che puoi usare in Swift 4 perché NSStrikethroughStyleAttributeName è stato modificato in NSAttributedStringKey.strikethroughStyle

let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: "Your Text")

attributeString.addAttribute(NSAttributedStringKey.strikethroughStyle, value: 2, range: NSMakeRange(0, attributeString.length))

self.lbl.attributedText = attributeString

0

Swift 4 e 5

extension NSAttributedString {

    /// Returns a new instance of NSAttributedString with same contents and attributes with strike through added.
     /// - Parameter style: value for style you wish to assign to the text.
     /// - Returns: a new instance of NSAttributedString with given strike through.
     func withStrikeThrough(_ style: Int = 1) -> NSAttributedString {
         let attributedString = NSMutableAttributedString(attributedString: self)
         attributedString.addAttribute(.strikethroughStyle,
                                       value: style,
                                       range: NSRange(location: 0, length: string.count))
         return NSAttributedString(attributedString: attributedString)
     }
}

Esempio

let example = NSAttributedString(string: "This is an example").withStrikeThrough(1)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.