Como posso criar um UILabel com texto tachado?

120

Eu quero criar um UILabelem que o texto seja assim

insira a descrição da imagem aqui

Como posso fazer isso? Quando o texto é pequeno, a linha também deve ser pequena.

Dev
fonte
1
Possível duplicata: stackoverflow.com/questions/10550732/…
removido em
Se você só precisa de suporte para iOS 6, pode fazer isso com um NSAttributedStringe a UILabel attributedTextpropriedade.
rmaddy
é possível remover o texto do botão
SCS

Respostas:

221

SWIFT 4 UPDATE CODE

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

então:

yourLabel.attributedText = attributeString

Para fazer alguma parte da corda atingir, em seguida, forneça alcance

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

Objective-C

No iOS 6.0> UILabel suportaNSAttributedString

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

Definição :

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

Parameters List:

nome : uma string especificando o nome do atributo. As chaves de atributo podem ser fornecidas por outra estrutura ou podem ser personalizadas que você definir. Para obter informações sobre onde encontrar as chaves de atributo fornecidas pelo sistema, consulte a seção de visão geral em Referência da classe NSAttributedString.

valor : o valor do atributo associado ao nome.

aRange : o intervalo de caracteres aos quais o par atributo / valor especificado se aplica.

Então

yourLabel.attributedText = attributeString;

Pois lesser than iOS 6.0 versionsvocê precisa 3-rd party componentfazer isso. Um deles é TTTAttributedLabel , outro é OHAttributedLabel .

Paresh Navadiya
fonte
Para a versão inferior do iOS 5.1.1, como posso usar o rótulo atribuído por terceiros para exibir o texto atribuído:?
Dev
Você pode sugerir um bom Toutorial? O link que você forneceu é um pouco difícil de entender .. :(
Dev
Você pode explicar o que devo fazer para criar uma gravadora atribuída por terceiros para ios
Dev
O que é @ 2? Número mágico?
Ben Sinclair
7
Eu acho que você se esqueceu de cometer isso. Você deve usar um valor adequado de NSUnderlineStyle em vez de @ 2. Sou um pouco pedante aqui.
Ben Sinclair
45

Em Swift, usando o enum para o estilo de linha tachada única:

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

Estilos de tachado adicionais ( lembre-se de acessar o enum usando .rawValue ):

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

Padrões tachados (para serem OR com o estilo):

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

Especifique que o tachado deve ser aplicado apenas em palavras (não em espaços):

  • NSUnderlineStyle.ByWord
Chris Trevarthen
fonte
1
Votou para usar a constante certa em vez de um número
Mihai Fratu
36

Eu prefiro NSAttributedStringa NSMutableAttributedStringeste caso simples:

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

Constantes para especificar os atributos NSUnderlineStyleAttributeNamee NSStrikethroughStyleAttributeNamede uma string atribuída:

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

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

Funcionou para mim como um encanto.

Use-o como extensão

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

Ligar assim

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

Extensão UILabel para tachado Ativar / Desativar.

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

Use-o assim:

   yourLabel.strikeThrough(btn.isSelected) // true OR false
Purnendu roy
fonte
Você conhece uma solução para o StrikeThrough não ser removido? Semelhante 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))

então:

yourLabel.attributedText = attributeString

Graças à resposta do Príncipe ;)

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

Outro método é usar 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
    }
}

Chamando a função: usei assim

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

Crédito para @Yahya - atualização de dezembro de 2017
Crédito para @kuzdu - atualização de agosto de 2018

Muhammad Asyraf
fonte
Não funciona para mim. A resposta de Purnendu roy funcionou para mim. A única diferença é que você passa value 0e Purnendu roy passavalue: NSUnderlineStyle.styleSingle.rawValue
kuzdu
@kuzdu engraçado que minha resposta foi em dezembro de 2017, funciona naquela época ele apenas copiou meu código e adicionou NSUnderlineStyle.styleSingle.rawValue ^ - ^ Mas não há problema, irei atualizar esta resposta apenas para deixá-lo feliz
Muhammad Asyraf
9

Você pode fazer isso no 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
fonte
8

Riscar o texto UILabel no Swift iOS. Por favor, tente isso está funcionando para mim

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

Você pode alterar seu "estilo tachado", como estiloSingle, styleThick, styleDouble insira a descrição da imagem aqui

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

Exemplo:

someLabel.attributedText = someText.strikeThrough()
Vladimir Pchelyakov
fonte
Diferença entre valor: 1 e valor: 2
iOS
2
O valor @iOS é a espessura da linha que tachado no texto. Quanto maior o valor, mais espessa é a linha que cruza o texto
Vladimir Pchelyakov,
4

Para quem está procurando como fazer isso em uma célula tableview (Swift), você deve definir o .attributeText assim:

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 quiser remover o tachado, faça isso, caso contrário, ele ficará grudado !:

cell.textLabel?.attributedText =  nil
Micro
fonte
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
Harshal Valanda
fonte
2

Posso chegar atrasado para a festa.

De qualquer forma, estou ciente do NSMutableAttributedStringmas recentemente consegui a mesma funcionalidade com uma abordagem um pouco diferente.

  • Eu adicionei o UIView com altura = 1.
  • Correspondeu as restrições à esquerda e à direita do UIView com as restrições à esquerda e à direita do rótulo
  • Alinhado o UIView no centro da etiqueta

Depois de seguir todos os passos acima, meu Label, UIView e suas restrições ficaram parecidos com a imagem abaixo.

insira a descrição da imagem aqui

user7420795
fonte
solução inteligente 👍
Dania Delbani
1

Use o código abaixo

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
fonte
1

Altere a propriedade do texto para atribuída e selecione o texto e clique com o botão direito para obter a propriedade da fonte. Clique no tachado. Captura de tela

Jayakrishnan
fonte
0

Para aqueles que enfrentam problemas com greves de texto de várias linhas

    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
Spydy
fonte
0

Crie a extensão String e adicione o método abaixo

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


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

return attributeString 

}

então use para o seu rótulo como este

yourLabel.attributedText = String.makeSlashText("Hello World!")
Josh Gray
fonte
0

Este é o que você pode usar no Swift 4 porque NSStrikethroughStyleAttributeName foi alterado para 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
fonte
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)
     }
}

Exemplo

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