如何创建带有删除线文本的UILabel?


Answers:


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)

目标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:

name:一个字符串,指定属性名称。属性键可以由另一个框架提供,也可以是您定义的自定义键。有关在哪里可以找到系统提供的属性键的信息,请参阅《 NSAttributedString类参考》中的概述部分。

value:与名称关联的属性值。

aRange:指定属性/值对所应用的字符范围。

然后

yourLabel.attributedText = attributeString;

因为lesser than iOS 6.0 versions你需3-rd party component要这样做。其中一个是TTTAttributedLabel,另一个是OHAttributedLabel


对于iOS 5.1.1以下版本,如何使用3方属性标签显示属性文本:
2012年

您能推荐一个好的Toutorial吗?您提供的链接有点难以理解。.::
2012年

您能解释一下为iOS创建第三方归因标签的方法吗?
2012年

什么是@ 2?幻数?
本·辛克莱

7
我猜你忘了那个。您应该使用NSUnderlineStyle中的适当值而不是@ 2。我在这里有点书呆子。
Ben Sinclair

45

在Swift中,将枚举用于单个删除线样式:

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

其他删除线样式(请记住使用.rawValue访问枚举):

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

删除线模式(与样式进行或运算):

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

指定删除线应仅应用于单词(而不是空格):

  • NSUnderlineStyle.ByWord

1
投票赞成使用正确的常数而不是数字
Mihai Fratu

36

我比较喜欢NSAttributedString,而不是NSMutableAttributedString为这个简单的例子:

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

用于同时指定属性字符串的NSUnderlineStyleAttributeNameNSStrikethroughStyleAttributeName属性的常量:

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

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

感谢王子的回答 ;)


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 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年12月
归功于@kuzdu- 更新于2018年8月


对我不起作用。Purnendu roy的答案对我有用。唯一的不同是您通过了value 0而Purnendu roy通过了value: NSUnderlineStyle.styleSingle.rawValue
kuzdu '18

@kuzdu有趣的是,我的答案是在2017年12月,它可以工作,然后他只是复制了我的代码并添加了NSUnderlineStyle.styleSingle.rawValue ^-^但我没问题,我将更新此答案只是为了让您开心
Muhammad Asyraf

9

您可以使用NSMutableAttributedString在IOS 6中进行操作。

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

8

在Swift iOS中删除UILabel文本。请尝试这个对我有用

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()

值:1和值:2之间的差异
iOS

2
@iOS值是删除文本的行的粗细。值越大,越过文本的线越粗
Vladimir Pchelyakov

4

对于希望在表格视图单元格(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

斯威夫特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但是最近我用稍微不同的方法实现了相同的功能。

  • 我添加了高度为1的UIView。
  • 使UIView的前导和尾随约束与标签的前导和尾随约束匹配
  • 将UIView对准Label的中心

完成上述所有步骤后,我的Label,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

将text属性更改为attributed并选择文本,然后右键单击以获取font属性。单击删除线。 屏幕截图


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

斯威夫特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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.