Jak mogę utworzyć UILabel z przekreślonym tekstem?


121

Chcę stworzyć taki, UILabelw którym tekst jest taki

wprowadź opis obrazu tutaj

W jaki sposób mogę to zrobić? Gdy tekst jest mały, linia również powinna być mała.



Jeśli potrzebujesz tylko iOS 6 wsparcie to można to zrobić z NSAttributedStringjak i UILabel attributedTextmienia.
rmaddy

czy można odblokować tekst przycisku
SCS

Odpowiedzi:


221

KOD AKTUALIZACJI SWIFT 4

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

następnie:

yourLabel.attributedText = attributeString

Aby część struny uderzyła, podaj zakres

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

Cel C

W iOS 6.0> UILabel obsługujeNSAttributedString

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

Szybki

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

Definicja :

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

Parameters List:

name : ciąg określający nazwę atrybutu. Klucze atrybutów mogą być dostarczane przez inną strukturę lub mogą być zdefiniowane przez użytkownika. Aby uzyskać informacje o tym, gdzie znaleźć klucze atrybutów dostarczone przez system, zobacz sekcję omówienie w dokumencie NSAttributedString Class Reference.

wartość : wartość atrybutu powiązana z nazwą.

aRange : zakres znaków, do których odnosi się określona para atrybut / wartość.

Następnie

yourLabel.attributedText = attributeString;

Dla lesser than iOS 6.0 versionstrzeba 3-rd party componentto zrobić. Jednym z nich jest TTTAttributedLabel , innym jest OHAttributedLabel .


W przypadku mniejszej wersji iOS 5.1.1, jak mogę użyć etykiety przypisanej przez inną firmę, aby wyświetlić przypisany tekst:?
Dev

Czy możesz zasugerować dobrego Toutorial? Link, który podałeś, jest trochę trudny do zrozumienia. :(
Dev,

Czy możesz wyjaśnić, co mam zrobić, aby utworzyć zewnętrzną etykietę przypisaną do systemu iOS
deweloperska

Co to jest @ 2? Magiczny numer?
Ben Sinclair

7
Chyba zapomniałeś o tym popełnić. Należy użyć odpowiedniej wartości z NSUnderlineStyle zamiast @ 2. Jestem tu trochę pedantyczny.
Ben Sinclair

45

W języku Swift, używając wyliczenia dla stylu pojedynczego przekreślonego wiersza:

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

Dodatkowe style przekreślenia ( pamiętaj, aby uzyskać dostęp do wyliczenia za pomocą .rawValue ):

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

Wzory przekreślenia (do usunięcia ze stylem):

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

Określ, że przekreślenie powinno być stosowane tylko w wyrazach (bez spacji):

  • NSUnderlineStyle.ByWord

1
W górę zagłosowano za użyciem właściwej stałej zamiast liczby
Mihai Fratu

36

Wolę NSAttributedStringraczej niż NSMutableAttributedStringw tym prostym przypadku:

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

Stałe do określania atrybutów NSUnderlineStyleAttributeNamei NSStrikethroughStyleAttributeNameatrybutów przypisanego ciągu:

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

Przekreślenie w 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

U mnie zadziałało jak urok.

Użyj go jako rozszerzenia

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

Zadzwoń tak

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

Rozszerzenie UILabel dla przekreślenia Włącz / Wyłącz.

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

Użyj tego w ten sposób:

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

Czy zdarzyło Ci się, że znasz rozwiązanie StrikeThr, które nie zostało usunięte? Podobne do forums.developer.apple.com/thread/121366
JeroenJK

23

KOD SWIFT

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

następnie:

yourLabel.attributedText = attributeString

Dzięki odpowiedzi 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

Inną metodą jest użycie rozszerzenia ciągu
znaków

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

Wywołanie funkcji: Użyłem tego w ten sposób

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

Kredyt dla @Yahya - aktualizacja grudzień 2017
Kredyt dla @kuzdu - aktualizacja sierpnia 2018


Nie działa na mnie. Odpowiedź Purnendu Roy'a działa dla mnie. Jedyną różnicą jest to, że mijasz value 0i Purnendu Roy Passvalue: NSUnderlineStyle.styleSingle.rawValue
kuzdu

@kuzdu zabawna rzecz, że moja odpowiedź była już w grudniu 2017 r., to działa, wtedy właśnie skopiował mój kod i dodał NSUnderlineStyle.styleSingle.rawValue ^ - ^ Ale nie ma problemu, zaktualizuję tę odpowiedź, aby cię uszczęśliwić
Muhammad Asyraf

9

Możesz to zrobić w IOS 6 za pomocą NSMutableAttributedString.

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

8

Przekreśl tekst UILabel w Swift iOS. Proszę, spróbuj tego, to działa dla mnie

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

Możesz zmienić swój „strikethroughStyle”, na przykład styleSingle, styleThick, styleDouble wprowadź opis obrazu tutaj


5

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

Przykład:

someLabel.attributedText = someText.strikeThrough()

Różnica między wartością: 1 a wartością: 2
iOS

2
Wartość @iOS to grubość linii przekreślającej tekst. Im większa wartość, tym grubsza linia przekreślająca tekst
Vladimir Pchelyakov

4

Dla każdego, kto szuka, jak to zrobić w komórce widoku tabeli (Swift), musisz ustawić .attributeText w następujący sposób:

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
    }

Jeśli chcesz usunąć przekreślenie, zrób to, w przeciwnym razie pozostanie !:

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

Mogę się spóźnić na przyjęcie.

Zresztą wiem o tym, NSMutableAttributedStringale ostatnio osiągnąłem tę samą funkcjonalność przy nieco innym podejściu.

  • Dodałem UIView z wysokością = 1.
  • Dopasowano wiodące i końcowe ograniczenia UIView z wiodącymi i końcowymi ograniczeniami etykiety
  • Wyrównano UIView na środku etykiety

Po wykonaniu wszystkich powyższych czynności moja Label, UIView i jego ograniczenia wyglądały jak na poniższym obrazku.

wprowadź opis obrazu tutaj


inteligentne rozwiązanie 👍
Dania Delbani

1

Użyj poniższego kodu

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

Zmień właściwość tekstu na przypisaną i zaznacz tekst i kliknij prawym przyciskiem myszy, aby uzyskać właściwość czcionki. Kliknij przekreślenie. Zrzut ekranu


0

Dla tych, którzy mają problem z przekreśleniem tekstu w wielu wierszach

    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

Utwórz rozszerzenie String i dodaj poniższą metodę

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


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

return attributeString 

}

następnie użyj dla swojej etykiety w ten sposób

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

0

To jest ten, którego możesz użyć w Swift 4, ponieważ NSStrikethroughStyleAttributeName został zmieniony na 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 i 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)
     }
}

Przykład

let example = NSAttributedString(string: "This is an example").withStrikeThrough(1)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.