Comment puis-je créer un UILabel avec du texte barré?


121

Je veux créer un UILabeldans lequel le texte est comme ça

entrez la description de l'image ici

Comment puis-je faire ceci? Lorsque le texte est petit, la ligne doit également être petite.


1
Double

Si vous n'avez besoin que du support iOS 6, vous pouvez le faire avec un NSAttributedStringet la UILabel attributedTextpropriété.
rmaddy

est-il possible de décocher le texte du bouton
SCS

Réponses:


221

CODE DE MISE À JOUR SWIFT 4

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

puis:

yourLabel.attributedText = attributeString

Pour faire une partie de la chaîne à frapper puis fournir une plage

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

Objectif c

Dans iOS 6.0> UILabel prend en chargeNSAttributedString

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

Rapide

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

Définition :

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

Parameters List:

name : une chaîne spécifiant le nom de l'attribut. Les clés d'attribut peuvent être fournies par un autre framework ou peuvent être des clés personnalisées que vous définissez. Pour plus d'informations sur l'emplacement des clés d'attribut fournies par le système, reportez-vous à la section Présentation dans NSAttributedString Class Reference.

value : la valeur d'attribut associée au nom.

aRange : plage de caractères à laquelle s'applique la paire attribut / valeur spécifiée.

ensuite

yourLabel.attributedText = attributeString;

Car lesser than iOS 6.0 versionsvous devez 3-rd party componentle faire. L'un d'eux est TTTAttributedLabel , un autre est OHAttributedLabel .


Pour la version inférieure d'iOS 5.1.1, comment puis-je utiliser l'étiquette attribuée par un tiers pour afficher le texte attribué:?
Dev

Pouvez-vous suggérer un bon Toutorial? Le lien que vous avez fourni est un peu difficile à comprendre .. :(
Dev

Pouvez-vous expliquer ce que je dois faire pour créer un label attribué par un tiers pour iOS
Dev

Qu'est-ce que @ 2? Nombre magique?
Ben Sinclair

7
Je suppose que vous avez oublié de commettre cela. Vous devez utiliser une valeur correcte de NSUnderlineStyle au lieu de @ 2. Je suis un peu pédant ici.
Ben Sinclair

45

Dans Swift, en utilisant l'énumération pour le style de ligne barrée simple:

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

Styles barrés supplémentaires ( n'oubliez pas d'accéder à l'énumération en utilisant .rawValue ):

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

Motifs barrés (à modifier par OU avec le style):

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

Spécifiez que le barré ne doit être appliqué que sur les mots (pas les espaces):

  • NSUnderlineStyle.ByWord

1
Up a voté pour l'utilisation de la bonne constante au lieu d'un nombre
Mihai Fratu

36

Je préfère NSAttributedStringplutôt que NSMutableAttributedStringpour ce cas simple:

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

Constantes pour spécifier à la fois les attributs NSUnderlineStyleAttributeNameet NSStrikethroughStyleAttributeNamed'une chaîne attribuée:

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

Barré dans 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

Cela a fonctionné pour moi comme un charme.

Utilisez-le comme extension

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

Appelez comme ça

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

Extension UILabel pour activer / désactiver le barré.

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

Utilisez-le comme ceci:

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

Connaissez-vous une solution pour que StrikeThrough ne soit pas supprimé? Similaire à forums.developer.apple.com/thread/121366
JeroenJK

23

CODE RAPIDE

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

puis:

yourLabel.attributedText = attributeString

Merci à Prince réponse ;)


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

Une autre méthode consiste à utiliser l'extension d' extension de chaîne

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

Appel de la fonction: utilisé comme tel

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

Crédit à @Yahya - mise à jour décembre 2017
Crédit à @kuzdu - mise à jour août 2018


Ça ne marche pas pour moi. La réponse de Purnendu roy fonctionne pour moi. La seule différence est que vous passez value 0et Purnendu Roy Passvalue: NSUnderlineStyle.styleSingle.rawValue
kuzdu

@kuzdu chose drôle que ma réponse était de retour en décembre 2017, cela fonctionne à l'époque, il vient de copier mon code et d'ajouter NSUnderlineStyle.styleSingle.rawValue ^ - ^ Mais pas de problème, je mettrai à jour cette réponse juste pour vous rendre heureux
Muhammad Asyraf

9

Vous pouvez le faire dans IOS 6 à l'aide de NSMutableAttributedString.

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

8

Biffez le texte UILabel dans Swift iOS. S'il vous plaît essayez ceci, cela fonctionne pour moi

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

Vous pouvez changer votre "style barré" comme styleSingle, styleThick, styleDouble entrez la description de l'image ici


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

Exemple:

someLabel.attributedText = someText.strikeThrough()

Différence entre la valeur: 1 et la valeur: 2
iOS

2
La valeur @iOS est l'épaisseur de la ligne qui traverse le texte. Plus la valeur est élevée, plus la ligne qui traverse le texte est
épaisse

4

Pour quiconque cherche comment faire cela dans une cellule tableview (Swift), vous devez définir le .attributeText comme ceci:

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 vous souhaitez supprimer le barré, faites-le sinon il restera!:

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

Je suis peut-être en retard à la fête.

Quoi qu'il en soit, je suis au courant de la NSMutableAttributedStringmais récemment j'ai obtenu la même fonctionnalité avec une approche légèrement différente.

  • J'ai ajouté l'UIView avec une hauteur = 1.
  • Mise en correspondance des contraintes de début et de fin de l'UIView avec les contraintes de début et de fin de l'étiquette
  • Alignement de l'UIView au centre de l'étiquette

Après avoir suivi toutes les étapes ci-dessus, mon étiquette, UIView et ses contraintes ressemblaient à l'image ci-dessous.

entrez la description de l'image ici


solution intelligente 👍
Dania Delbani

1

Utilisez le code ci-dessous

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

Changez la propriété de texte en attribuée et sélectionnez le texte et cliquez avec le bouton droit pour obtenir la propriété de police. Cliquez sur le barré. Capture d'écran


0

Pour ceux qui rencontrent des problèmes avec la grève de texte sur plusieurs lignes

    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

Créez une extension de chaîne et ajoutez la méthode ci-dessous

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


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

return attributeString 

}

puis utilisez pour votre étiquette comme ceci

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

0

C'est celui que vous pouvez utiliser dans Swift 4 car NSStrikethroughStyleAttributeName a été changé en 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 et 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)
     }
}

Exemple

let example = NSAttributedString(string: "This is an example").withStrikeThrough(1)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.