¿Cómo puedo crear una UILabel con texto tachado?

121

Quiero crear un UILabelen el que el texto sea así.

ingrese la descripción de la imagen aquí

¿Cómo puedo hacer esto? Cuando el texto es pequeño, la línea también debe ser pequeña.

Dev
fuente
1
Posible duplicado: stackoverflow.com/questions/10550732/…
trapeado
Si solo necesita compatibilidad con iOS 6, puede hacerlo con una NSAttributedStringy la UILabel attributedTextpropiedad.
rmaddy
¿Es posible desactivar el texto del botón
SCS

Respuestas:

221

CÓDIGO DE ACTUALIZACIÓN DE SWIFT 4

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

luego:

yourLabel.attributedText = attributeString

Para hacer que una parte de la cuerda golpee, proporcione rango

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

C objetivo

En iOS 6.0> UILabel admiteNSAttributedString

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

Rápido

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

Definición :

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

Parameters List:

nombre : una cadena que especifica el nombre del atributo. Las claves de atributo pueden ser proporcionadas por otro marco o pueden ser personalizadas que usted defina. Para obtener información sobre dónde encontrar las claves de atributo proporcionadas por el sistema, consulte la sección de descripción general en Referencia de clase NSAttributedString.

valor : el valor del atributo asociado con el nombre.

aRange : el rango de caracteres al que se aplica el par atributo / valor especificado.

Luego

yourLabel.attributedText = attributeString;

Porque lesser than iOS 6.0 versionsnecesitas 3-rd party componenthacer esto. Uno de ellos es TTTAttributedLabel , otro es OHAttributedLabel .

Paresh Navadiya
fuente
Para la versión inferior de iOS 5.1.1, ¿cómo puedo usar la etiqueta atribuida por terceros para mostrar el texto atribuido?
Desarrollo
¿Puedes sugerir un buen Toutorial? El enlace que proporcionó es un poco difícil de entender .. :(
Dev
¿Puede explicar qué debo hacer para crear una etiqueta atribuida a un tercero para ios
Desarrollador
¿Qué es @ 2? ¿Número mágico?
Ben Sinclair
7
Supongo que olvidaste cometer eso. Debe utilizar un valor adecuado de NSUnderlineStyle en lugar de @ 2. Soy un poco pedante aquí.
Ben Sinclair
45

En Swift, usando la enumeración para un estilo de línea tachado simple:

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

Estilos tachados adicionales ( recuerde acceder a la enumeración usando .rawValue ):

  • NSUnderlineStyle.Style Ninguno
  • NSUnderlineStyle.StyleSingle
  • NSUnderlineStyle.StyleThick
  • NSUnderlineStyle.StyleDouble

Patrones tachados (para ser editado con OR con el estilo):

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

Especifique que el tachado solo debe aplicarse a las palabras (no a los espacios):

  • NSUnderlineStyle.ByWord
Chris Trevarthen
fuente
1
Votó a favor de usar la constante correcta en lugar de un número
Mihai Fratu
36

Prefiero en NSAttributedStringlugar de NSMutableAttributedStringeste simple caso:

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

Constantes para especificar los atributos NSUnderlineStyleAttributeNamey NSStrikethroughStyleAttributeNamede una cadena con atributos:

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

Tachado en 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

Me funcionó a las mil maravillas.

Úselo como extensión

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

Llamar así

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

Extensión UILabel para activar / desactivar tachado.

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

Úselo así:

   yourLabel.strikeThrough(btn.isSelected) // true OR false
Purnendu roy
fuente
¿Conoce una solución para que StrikeThrough no se elimine? Similar a forums.developer.apple.com/thread/121366
JeroenJK
23

CÓDIGO SWIFT

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

luego:

yourLabel.attributedText = attributeString

Gracias a la respuesta de Prince ;)

pekpon
fuente
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

Otro método es utilizar 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
    }
}

Llamar a la función: la usé así

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

Crédito a @Yahya - actualización de diciembre de 2017
Crédito a @kuzdu - actualización de agosto de 2018

Muhammad Asyraf
fuente
No me funciona. La respuesta de Purnendu Roy funciona para mí. La única diferencia es que pasas value 0y Purnendu Roy pasavalue: NSUnderlineStyle.styleSingle.rawValue
kuzdu
@kuzdu lo gracioso es que mi respuesta fue en diciembre de 2017, funciona en ese momento, simplemente copió mi código y agregó NSUnderlineStyle.styleSingle.rawValue ^ - ^ Pero no hay problema, actualizaré esta respuesta solo para hacerte feliz
Muhammad Asyraf
9

Puede hacerlo en 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;
Ameet Dhas
fuente
8

Tacha el texto de UILabel en Swift iOS. Por favor, intente esto, funciona para mí

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

Puede cambiar su "estilo tachado" como styleSingle, styleThick, styleDouble ingrese la descripción de la imagen aquí

Karthickkck
fuente
5

Rápido 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
     }
   }

Ejemplo:

someLabel.attributedText = someText.strikeThrough()
Vladimir Pchelyakov
fuente
Diferencia entre valor: 1 y valor: 2
iOS
2
El valor @iOS es el grosor de la línea que atraviesa el texto. Cuanto mayor sea el valor, más gruesa
será
4

Para cualquiera que busque cómo hacer esto en una celda de vista de tabla (Swift), debe establecer el .attributeText de esta manera:

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
    }

Si desea eliminar el tachado, hágalo, de lo contrario, se quedará.

cell.textLabel?.attributedText =  nil
Micro
fuente
2

Rápido 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
Harshal Valanda
fuente
2

Puede que llegue tarde a la fiesta.

De todos modos, soy consciente del NSMutableAttributedStringpero recientemente logré la misma funcionalidad con un enfoque ligeramente diferente.

  • Agregué el UIView con altura = 1.
  • Coincidió con las restricciones iniciales y finales de UIView con las restricciones iniciales y finales de la etiqueta
  • Alineó la vista UIV en el centro de la etiqueta

Después de seguir todos los pasos anteriores, mi Etiqueta, UIView y sus restricciones se veían como la imagen de abajo.

ingrese la descripción de la imagen aquí

usuario7420795
fuente
solución inteligente 👍
Dania Delbani
1

Utilice el siguiente código

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;   
Hardik Thakkar
fuente
1

Cambie la propiedad de texto a atribuida y seleccione el texto y haga clic derecho para obtener la propiedad de fuente. Haga clic en el tachado. Captura de pantalla

Jayakrishnan
fuente
0

Para aquellos que enfrentan problemas con la huelga de texto de varias líneas

    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
Espía
fuente
0

Cree la extensión de cadena y agregue el método siguiente

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


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

return attributeString 

}

luego úsalo para tu etiqueta como esta

yourLabel.attributedText = String.makeSlashText("Hello World!")
Josh Grey
fuente
0

Este es el que puede usar en Swift 4 porque NSStrikethroughStyleAttributeName se ha cambiado a NSAttributedStringKey.strikethroughStyle

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

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

self.lbl.attributedText = attributeString
vikram
fuente
0

Swift 4 y 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)
     }
}

Ejemplo

let example = NSAttributedString(string: "This is an example").withStrikeThrough(1)
Rashid Latif
fuente