ฉันจะสร้าง UILabel ด้วยข้อความขีดทับได้อย่างไร


121

ฉันต้องการสร้างUILabelข้อความที่เป็นแบบนี้

ใส่คำอธิบายภาพที่นี่

ฉันจะทำเช่นนี้ได้อย่างไร? เมื่อข้อความมีขนาดเล็กบรรทัดควรมีขนาดเล็กด้วย


1
อาจซ้ำกันได้: stackoverflow.com/questions/10550732/…
mopsled

หากคุณต้องการเพียง iOS 6 การสนับสนุนจากนั้นคุณสามารถทำเช่นนี้กับNSAttributedStringและUILabel attributedTextสถานที่ให้บริการ
rmaddy

เป็นไปได้ไหมที่จะปลดข้อความปุ่ม
SCS

คำตอบ:


221

รหัสอัปเดต SWIFT 4

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

แล้ว:

yourLabel.attributedText = attributeString

หากต้องการสร้างบางส่วนของสตริงเพื่อขีดฆ่าให้ระบุช่วง

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

Objective-C

ในiOS 6.0> UILabelรองรับNSAttributedString

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

รวดเร็ว

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

คำจำกัดความ :

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

Parameters List:

ชื่อ : สตริงที่ระบุชื่อแอ็ตทริบิวต์ คีย์แอตทริบิวต์สามารถจัดทำโดยเฟรมเวิร์กอื่นหรืออาจเป็นคีย์ที่คุณกำหนดเองก็ได้ สำหรับข้อมูลเกี่ยวกับตำแหน่งที่จะค้นหาคีย์แอ็ตทริบิวต์ที่ระบบจัดหาให้ดูส่วนภาพรวมในการอ้างอิงคลาส NSAttributedString

ค่า : ค่าแอตทริบิวต์ที่เกี่ยวข้องกับชื่อ

aRange : ช่วงของอักขระที่ใช้คู่แอตทริบิวต์ / ค่าที่ระบุ

แล้วก็

yourLabel.attributedText = attributeString;

สำหรับlesser than iOS 6.0 versionsคุณต้อง3-rd party componentทำเช่นนี้ หนึ่งในนั้นคือTTTAttributedLabelอื่นเป็นOHAttributedLabel


สำหรับ iOS 5.1.1 เวอร์ชันที่น้อยกว่าฉันจะใช้ป้ายกำกับที่มาจากบุคคลที่ 3 เพื่อแสดงข้อความที่ระบุแหล่งที่มาได้อย่างไร:?
Dev

คุณสามารถแนะนำ Toutorial ที่ดีได้หรือไม่? ลิงค์ที่คุณให้มานั้นเข้าใจยากไปหน่อย .. :(
Dev

คุณช่วยอธิบายได้ไหมว่าฉันควรทำอย่างไรในการสร้าง Label ที่แสดงโดยบุคคลที่สามสำหรับ iOS
Dev

@ 2 คืออะไร? เลขวิเศษ?
Ben Sinclair

7
ฉันเดาว่าคุณลืมที่จะยอมรับสิ่งนั้น คุณควรใช้ค่าที่เหมาะสมจาก NSUnderlineStyle แทน @ 2 ฉันขี้อวดนิดหน่อยที่นี่
Ben Sinclair

45

ใน Swift ใช้ enum สำหรับรูปแบบเส้นขีดเดียว:

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

รูปแบบขีดทับเพิ่มเติม ( อย่าลืมเข้าถึง enum โดยใช้ .rawValue ):

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

รูปแบบขีดทับ (เพื่อให้สอดคล้องกับสไตล์):

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

ระบุว่าควรใช้ขีดฆ่าข้ามคำเท่านั้น (ไม่เว้นวรรค):

  • NSUnderlineStyle.ByWord

1
Up โหวตให้ใช้ค่าคงที่ถูกต้องแทนตัวเลข
Mihai Fratu

36

ฉันชอบNSAttributedStringมากกว่าNSMutableAttributedStringสำหรับกรณีง่ายๆนี้:

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

ค่าคงที่สำหรับระบุทั้งแอตทริบิวต์NSUnderlineStyleAttributeNameและNSStrikethroughStyleAttributeNameแอตทริบิวต์ของสตริงที่ประกอบ:

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

Strikethrough ใน 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

มันได้ผลสำหรับฉันเหมือนมีเสน่ห์

ใช้เป็นส่วนขยาย

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

เรียกแบบนี้

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

ส่วนขยาย UILabel สำหรับขีดฆ่าเปิด / ปิดการใช้งาน

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

ใช้แบบนี้:

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

คุณบังเอิญรู้วิธีแก้ปัญหา StrikeThrough ที่ไม่ถูกลบหรือไม่? คล้ายกับforums.developer.apple.com/thread/121366
JeroenJK

23

รหัส SWIFT

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

แล้ว:

yourLabel.attributedText = attributeString

ขอบคุณคำตอบ 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

วิธีอื่นคือใช้ 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
    }
}

การเรียกใช้ฟังก์ชัน:ใช้อย่างนั้น

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

เครดิต @Yahya - อัปเดตธันวาคม 2017
เครดิต @kuzdu - อัปเดต ส.ค. 2018


ไม่ได้ผลสำหรับฉัน คำตอบของ Purnendu roy ใช้ได้ผลสำหรับฉัน ข้อแตกต่างเพียงอย่างเดียวคือคุณผ่านเข้าvalue 0และ Purnendu roy passvalue: NSUnderlineStyle.styleSingle.rawValue
kuzdu

@kuzdu ตลกดีที่คำตอบของฉันกลับมาในธันวาคม 2017 มันใช้งานได้แล้วเขาก็แค่คัดลอกรหัสของฉันและเพิ่ม NSUnderlineStyle.styleSingle.rawValue ^ - ^ แต่ไม่มีปัญหาฉันจะอัปเดตคำตอบนี้เพื่อให้คุณมีความสุข
Muhammad Asyraf

9

คุณสามารถทำได้ใน IOS 6 โดยใช้ NSMutableAttributedString

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

8

ขีดฆ่าข้อความ UILabel ใน Swift iOS โปรดลองใช้มันได้ผลสำหรับฉัน

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

คุณสามารถเปลี่ยน "strikethroughStyle" ของคุณเช่น styleSingle, styleThick, styleDouble ใส่คำอธิบายภาพที่นี่


5

สวิฟต์ 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
     }
   }

ตัวอย่าง:

someLabel.attributedText = someText.strikeThrough()

ความแตกต่างระหว่าง value: 1 และ value: 2
iOS

2
ค่า @iOS คือความหนาของเส้นที่ขีดทับข้อความ ค่ายิ่งมากเส้นที่ตัดผ่านข้อความก็จะยิ่งหนาขึ้น
Vladimir Pchelyakov

4

สำหรับใครที่กำลังมองหาวิธีทำในเซลล์ tableview (Swift) คุณต้องตั้งค่า. AttributeText ดังนี้:

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
    }

หากคุณต้องการลบขีดฆ่าให้ทำเช่นนี้มิฉะนั้นมันจะค้าง!:

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

ฉันอาจจะไปงานปาร์ตี้สาย

อย่างไรก็ตามฉันทราบเกี่ยวกับNSMutableAttributedStringแต่เมื่อเร็ว ๆ นี้ฉันได้รับฟังก์ชันเดียวกันนี้ด้วยวิธีการที่แตกต่างกันเล็กน้อย

  • ฉันเพิ่ม UIView ด้วยความสูง = 1
  • จับคู่ข้อ จำกัด นำหน้าและต่อท้ายของ UIView กับข้อ จำกัด นำหน้าและต่อท้ายของฉลาก
  • จัดตำแหน่ง UIView ที่กึ่งกลางของป้ายกำกับ

หลังจากทำตามขั้นตอนข้างต้นทั้งหมดป้ายกำกับของฉัน UIView และข้อ จำกัด ก็ดูเหมือนภาพด้านล่าง

ใส่คำอธิบายภาพที่นี่


โซลูชันอัจฉริยะ👍
Dania Delbani

1

ใช้รหัสด้านล่าง

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

เปลี่ยนคุณสมบัติข้อความเป็นแอตทริบิวต์และเลือกข้อความและคลิกขวาเพื่อรับคุณสมบัติแบบอักษร คลิกที่ขีดทับ ภาพหน้าจอ


0

สำหรับผู้ที่ประสบปัญหาการขีดฆ่าข้อความหลายบรรทัด

    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

สร้างนามสกุลสตริงและเพิ่มวิธีการด้านล่าง

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


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

return attributeString 

}

จากนั้นใช้สำหรับฉลากของคุณเช่นนี้

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

0

นี่คือสิ่งที่คุณสามารถใช้ได้ใน Swift 4 เนื่องจาก NSStrikethroughStyleAttributeName ถูกเปลี่ยนเป็น 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 และ 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)
     }
}

ตัวอย่าง

let example = NSAttributedString(string: "This is an example").withStrikeThrough(1)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.