Bagaimana saya bisa membuat UILabel dengan teks coret?

121

Saya ingin membuat UILabelteks yang seperti ini

masukkan deskripsi gambar di sini

Bagaimana saya bisa melakukan ini? Jika teksnya kecil, garisnya juga harus kecil.

Dev
sumber
1
Kemungkinan duplikat: stackoverflow.com/questions/10550732/…
mopsled
Jika Anda hanya membutuhkan dukungan iOS 6, Anda dapat melakukannya dengan NSAttributedStringdan UILabel attributedTextproperti.
rmaddy
apakah mungkin untuk menghapus teks tombol
SCS

Jawaban:

221

KODE UPDATE SWIFT 4

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

kemudian:

yourLabel.attributedText = attributeString

Untuk membuat beberapa bagian dari string menyerang maka berikan jarak

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

Objective-C

Di iOS 6.0> UILabel mendukungNSAttributedString

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

Cepat

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

Definisi :

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

Parameters List:

name : Sebuah string yang menentukan nama atribut. Kunci atribut dapat diberikan oleh kerangka kerja lain atau dapat menjadi kunci khusus yang Anda tentukan. Untuk informasi tentang di mana menemukan kunci atribut yang disediakan sistem, lihat bagian ikhtisar di Referensi Kelas NSAttributedString.

nilai : Nilai atribut yang terkait dengan nama.

aRange : Rentang karakter yang diterapkan pasangan atribut / nilai tertentu.

Kemudian

yourLabel.attributedText = attributeString;

Karena lesser than iOS 6.0 versionsAnda perlu 3-rd party componentmelakukan ini. Salah satunya adalah TTTAttributedLabel , yang lainnya adalah OHAttributedLabel .

Paresh Navadiya
sumber
Untuk iOS 5.1.1 versi yang lebih rendah, bagaimana cara menggunakan Label yang diatribusikan pihak ke-3 untuk menampilkan teks yang diatribusikan:?
Dev
Bisakah Anda menyarankan Toutorial yang bagus? Tautan yang Anda berikan agak sulit dimengerti .. :(
Dev
Bisakah Anda menjelaskan apa yang harus saya lakukan untuk membuat Label yang dikaitkan pihak ketiga untuk ios
Dev
Apa @ 2? Nomor ajaib?
Ben Sinclair
7
Saya kira Anda lupa melakukan itu. Anda harus menggunakan nilai yang sesuai dari NSUnderlineStyle, bukan @ 2. Saya sedikit bertele-tele di sini.
Ben Sinclair
45

Di Swift, menggunakan enum untuk gaya garis coretan tunggal:

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

Gaya coretan tambahan ( Ingatlah untuk mengakses enum menggunakan .rawValue ):

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

Pola coret (di-OR-ed dengan gaya):

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

Tentukan bahwa coretan seharusnya hanya diterapkan di seluruh kata (bukan spasi):

  • NSUnderlineStyle.ByWord
Chris Trevarthen
sumber
1
Up memilih untuk menggunakan konstanta kanan alih-alih angka
Mihai Fratu
36

Saya lebih NSAttributedStringsuka daripada NSMutableAttributedStringkasus sederhana ini:

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

Konstanta untuk menentukan atribut NSUnderlineStyleAttributeNamedan NSStrikethroughStyleAttributeNamedari string yang diatribusikan:

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
sumber
27

Coret di 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

Ini bekerja untuk saya seperti pesona.

Gunakan itu sebagai ekstensi

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

Panggil seperti ini

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

Ekstensi UILabel untuk coret Aktifkan / Nonaktifkan.

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

Gunakan seperti ini:

   yourLabel.strikeThrough(btn.isSelected) // true OR false
Purnendu roy
sumber
Apakah Anda mengetahui solusi agar StrikeThrough tidak dihapus? Mirip dengan forums.developer.apple.com/thread/121366
JeroenJK
23

TUKAR KODE

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

kemudian:

yourLabel.attributedText = attributeString

Berkat jawaban Pangeran ;)

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

Metode lainnya adalah dengan menggunakan Ekstensi Ekstensi String

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

Memanggil fungsi: Digunakan seperti itu

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

Kredit untuk @Yahya - Update Desember 2017
kredit untuk @kuzdu - Update Agustus 2018

Muhammad Asyraf
sumber
Tidak berhasil untuk saya. Jawaban Purnendu roy berhasil untukku. Satu-satunya perbedaan adalah bahwa Anda lulus value 0dan Purnendu roy lulusvalue: NSUnderlineStyle.styleSingle.rawValue
kuzdu
@kuzdu lucu bahwa jawaban saya kembali pada des 2017 itu berfungsi saat itu dia hanya menyalin kode saya dan menambahkan NSUnderlineStyle.styleSingle.rawValue ^ - ^ Tapi tidak masalah saya akan memperbarui jawaban ini hanya untuk membuat Anda bahagia
Muhammad Asyraf
9

Anda dapat melakukannya di IOS 6 menggunakan NSMutableAttributedString.

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

Coret teks UILabel di Swift iOS. Silakan coba ini berhasil untuk saya

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

Anda dapat mengubah "strikethroughStyle" seperti styleSingle, styleThick, styleDouble masukkan deskripsi gambar di sini

Karthickkck
sumber
5

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

Contoh:

someLabel.attributedText = someText.strikeThrough()
Vladimir Pchelyakov
sumber
Perbedaan antara nilai: 1 dan nilai: 2
iOS
2
Nilai @iOS adalah ketebalan garis yang mencoret teks. Semakin besar nilainya, semakin tebal garis yang memotong teks
Vladimir Pchelyakov
4

Bagi siapa pun yang mencari cara melakukan ini dalam sel tableview (Swift), Anda harus menyetel .attributeText seperti ini:

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
    }

Jika Anda ingin menghapus coretan lakukan ini jika tidak maka akan tetap ada !:

cell.textLabel?.attributedText =  nil
Mikro
sumber
2

Swift 4.2.0

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
sumber
2

Saya mungkin terlambat ke pesta.

Bagaimanapun, saya mengetahui tentang itu NSMutableAttributedStringtetapi baru-baru ini saya mencapai fungsi yang sama dengan pendekatan yang sedikit berbeda.

  • Saya menambahkan UIView dengan tinggi = 1.
  • Cocokkan batasan awal dan akhir dari UIView dengan batasan awal dan akhir dari label
  • Sejajarkan UIView di tengah Label

Setelah mengikuti semua langkah di atas Label saya, UIView dan batasannya terlihat seperti gambar di bawah ini.

masukkan deskripsi gambar di sini

pengguna7420795
sumber
solusi cerdas 👍
Dania Delbani
1

Gunakan kode di bawah ini

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

Ubah properti teks menjadi dikaitkan dan pilih teks dan klik kanan untuk mendapatkan properti font. Klik pada coretan. Screenshot

Jayakrishnan
sumber
0

Bagi mereka yang menghadapi masalah dengan serangan teks multi baris

    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
sumber
0

Buat ekstensi String dan tambahkan metode di bawah ini

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


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

return attributeString 

}

lalu gunakan untuk label Anda seperti ini

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

Ini yang dapat Anda gunakan di Swift 4 karena NSStrikethroughStyleAttributeName telah diubah menjadi 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
sumber
0

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

Contoh

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