Làm cách nào để tạo một UILabel với văn bản gạch ngang?


120

Tôi muốn tạo một UILabeltrong đó văn bản như thế này

nhập mô tả hình ảnh ở đây

Tôi có thể làm cái này như thế nào? Khi văn bản nhỏ, dòng cũng phải nhỏ.



Nếu bạn chỉ cần hỗ trợ iOS 6 thì bạn có thể thực hiện việc này với một NSAttributedStringvà thuộc UILabel attributedTexttính.
rmaddy

có thể bỏ đánh dấu văn bản nút không
SCS

Câu trả lời:


221

MÃ CẬP NHẬT SWIFT 4

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

sau đó:

yourLabel.attributedText = attributeString

Để thực hiện một số phần của chuỗi để tấn công, sau đó cung cấp phạm vi

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

Objective-C

Trong iOS 6.0> UILabel hỗ trợNSAttributedString

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

Nhanh

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

Định nghĩa :

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

Parameters List:

name : Một chuỗi chỉ định tên thuộc tính. Các khóa thuộc tính có thể được cung cấp bởi một khuôn khổ khác hoặc có thể là những khóa tùy chỉnh do bạn xác định. Để biết thông tin về nơi tìm khóa thuộc tính do hệ thống cung cấp, hãy xem phần tổng quan trong Tham chiếu Lớp NSAttributedString.

value : Giá trị thuộc tính được liên kết với tên.

aRange : Phạm vi ký tự áp dụng cặp thuộc tính / giá trị đã chỉ định.

Sau đó

yourLabel.attributedText = attributeString;

Đối với lesser than iOS 6.0 versionsbạn cần 3-rd party componentphải làm điều này. Một trong số đó là TTTAttributedLabel , một trong số đó là OHAttributedLabel .


Đối với phiên bản iOS 5.1.1 thấp hơn, làm cách nào tôi có thể sử dụng Nhãn được phân bổ của 3 bên để hiển thị văn bản được phân bổ:?
Dev

Bạn có thể đề xuất một Hướng dẫn tốt không? Các liên kết mà bạn cung cấp là một chút khó hiểu .. :(
Dev

Bạn có thể giải thích những gì tôi nên làm gì để tạo ra một bên thứ ba do Label for ios
Dev

@ 2 là gì? Con số kỳ diệu?
Ben Sinclair

7
Tôi đoán bạn đã quên cam kết điều đó. Bạn nên sử dụng một giá trị thích hợp từ NSUnderlineStyle thay vì @ 2. Tôi ở đây có một chút lãng mạn.
Ben Sinclair

45

Trong Swift, sử dụng enum cho kiểu dòng gạch ngang:

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

Các kiểu gạch ngang bổ sung ( Hãy nhớ truy cập enum bằng cách sử dụng .rawValue ):

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

Các mẫu gạch ngang (được HOẶC phù hợp với kiểu):

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

Chỉ định rằng gạch ngang chỉ nên được áp dụng trên các từ (không phải dấu cách):

  • NSUnderlineStyle.ByWord

1
Đã bỏ phiếu cho việc sử dụng hằng số phù hợp thay vì một số
Mihai Fratu

36

Tôi thích NSAttributedStringhơn là NSMutableAttributedStringcho trường hợp đơn giản này:

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

Các hằng số để chỉ định cả thuộc tính NSUnderlineStyleAttributeNameNSStrikethroughStyleAttributeNamethuộc tính của một chuỗi được phân bổ:

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

Gạch ngang trong 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

Nó làm việc cho tôi như một cái duyên.

Sử dụng nó làm phần mở rộng

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

Gọi như thế này

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

Tiện ích mở rộng nhãn cho gạch ngang Bật / Tắt.

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

Sử dụng nó như thế này:

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

Bạn có tình cờ biết một giải pháp để StrikeThrough không bị xóa không? Tương tự như forums.developer.apple.com/thread/121366
JeroenJK

23

MÃ SWIFT

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

sau đó:

yourLabel.attributedText = attributeString

Cảm ơn câu trả lời của 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

Phương pháp khác là sử dụng Phần mở rộng chuỗi mở
rộng

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

Gọi chức năng: Đã sử dụng nó như vậy

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

Tín dụng cho @Yahya - cập nhật tháng 12 năm 2017
Tín dụng cho @kuzdu - cập nhật tháng 8 năm 2018


Không hiệu quả với tôi. Câu trả lời của Purnendu roy phù hợp với tôi. Sự khác biệt duy nhất là bạn vượt qua trong value 0và Purnendu roy quavalue: NSUnderlineStyle.styleSingle.rawValue
kuzdu

@kuzdu điều buồn cười rằng câu trả lời của tôi đã trở lại trong tháng 12 năm 2017 nó hoạt động trở lại sau đó ông chỉ sao chép mã của tôi và thêm lên NSUnderlineStyle.styleSingle.rawValue ^ - ^ Nhưng không có vấn đề tôi sẽ cập nhật câu trả lời này chỉ để làm cho bạn hạnh phúc
Muhammad Asyraf

9

Bạn có thể làm điều đó trong IOS 6 bằng NSMutableAttributedString.

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

8

Loại bỏ văn bản UILabel trong Swift iOS. Hãy thử cái này nó làm việc cho tôi

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

Bạn có thể thay đổi "phong cách gạch ngang" của mình như styleSingle, styleThick, styleDouble nhập mô tả hình ảnh ở đây


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

Thí dụ:

someLabel.attributedText = someText.strikeThrough()

Sự khác biệt giữa giá trị: 1 và giá trị: 2
iOS

2
Giá trị @iOS là độ dày của dòng gạch ngang văn bản. Lớn hơn giá trị, càng dày đường mà đi qua các văn bản
Vladimir Pchelyakov

4

Đối với bất kỳ ai đang tìm cách thực hiện việc này trong ô tableview (Swift), bạn phải đặt .attributeText như sau:

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
    }

Nếu bạn muốn loại bỏ gạch ngang, hãy làm điều này nếu không nó sẽ dính xung quanh !:

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

Tôi có thể đến muộn bữa tiệc.

Dù sao, tôi cũng biết về chức năng NSMutableAttributedStringnhưng gần đây tôi đã đạt được chức năng tương tự với cách tiếp cận hơi khác.

  • Tôi đã thêm UIView với height = 1.
  • Đối sánh các ràng buộc đầu và cuối của UIView với các ràng buộc đầu và cuối của nhãn
  • Căn chỉnh UIView ở giữa Nhãn

Sau khi làm theo tất cả các bước trên, Nhãn, UIView và các ràng buộc của nó trông giống như hình dưới đây.

nhập mô tả hình ảnh ở đây


giải pháp thông minh 👍
Dania Delbani

1

Sử dụng mã bên dưới

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

Thay đổi thuộc tính văn bản thành thuộc tính và chọn văn bản và nhấp chuột phải để nhận thuộc tính phông chữ. Nhấp vào gạch ngang. Ảnh chụp màn hình


0

Đối với những người gặp vấn đề với cảnh cáo văn bản nhiều dòng

    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

Tạo phần mở rộng chuỗi và thêm phương thức bên dưới

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


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

return attributeString 

}

sau đó sử dụng cho nhãn của bạn như thế này

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

0

Đây là cái bạn có thể sử dụng trong Swift 4 vì NSStrikethroughStyleAttributeName đã được đổi thành 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 và 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)
     }
}

Thí dụ

let example = NSAttributedString(string: "This is an example").withStrikeThrough(1)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.