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

我想创建一个 UILabel,其中的文本是这样的

enter image description here

我怎样才能做到这一点? 当文字很小,行也应该很小。

91795 次浏览

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

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

SWIFT 5更新代码

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

然后:

yourLabel.attributedText = attributeString

使绳子的一部分打击然后提供范围

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

目标 C

IOS 6.0 > 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 : 与 name 关联的属性值。

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

然后

yourLabel.attributedText = attributeString;

对于 lesser than iOS 6.0 versions,你需要 3-rd party component来做这件事。 一个是 属性标签另一个是 OHAttributedLabel

对于这个简单的情况,我更喜欢 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;

快速密码

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

然后:

yourLabel.attributedText = attributeString

感谢 王子回答;)

使用以下代码

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;

在 Swift 中,使用单击直线的风格:

let attributedText = NSAttributedString(
string: "Label Text",
attributes: [.strikethroughStyle: NSUnderlineStyle.single.rawValue]
)
label.attributedText = attributedText

附加突破风格(记住使用.rawValue) :

  • .none
  • .single
  • .thick
  • .double

划线模式(用样式进行 OR-ed) :

  • .patternDot
  • .patternDash
  • .patternDashDot
  • .patternDashDotDot

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

  • .byWord

对于任何在桌面视图单元格(Swift)中查看如何执行此操作的人,必须设置。像这样的文本:

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

对于那些谁面临的问题与多行文本罢工

    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

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

其他方法是使用字符串扩展
分机

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 < em >-2017年12月更新
感谢@kuzdu - 二零一八年八月更新 < br >

在 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

您可以更改您的“ strikethrough Style”,如 styleSingle、 styleThick、 styleDouble enter image description here

创建 String 扩展并添加以下方法

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!")

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

通过 Enable/Disable 对 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

这是您可以在 Swift 4中使用的一个,因为 NSStrikethrough StyleAttributeName 已更改为 NSAttributedStringKey.strikethrough Style

let attributeString: NSMutableAttributedString =  NSMutableAttributedString(string: "Your Text")


attributeString.addAttribute(NSAttributedStringKey.strikethroughStyle, value: 2, range: NSMakeRange(0, attributeString.length))


self.lbl.attributedText = attributeString

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

将 text 属性更改为 tribute,并选择 text,然后右键单击以获取 font 属性。点击“三振出局”。 Screenshot

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

例如:

someLabel.attributedText = someText.strikeThrough()

我可能会迟到。

无论如何,我知道关于 NSMutableAttributedString,但最近我实现了相同的功能与略有不同的方法。

  • 我添加了高度 = 1的 UIView。
  • 将 UIView 的前导和后导约束与标签的前导和后导约束匹配
  • 在标签中心对齐 UIView

经过以上步骤,我的标签,UIView 和它的约束看起来像下图。

enter image description here

斯威夫特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: "440").withStrikeThrough(1)
myLabel.attributedText = example

结果

enter image description here

在 iOS 10.3上,通过添加一个 NSBaselineOffsetAttributeName (正如这里所解释的)到属性化字符串中,在呈现删除线修复方面存在一个问题,这样可以恢复删除线。特别是在集合视图或表格视图单元格中,覆盖 draText: in: 可能会很慢。

一个溶胶-添加视图,以呈现一行。

第二个太阳

attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: 2, range: NSMakeRange(0, attributeString.length))
attributeString.addAttribute(NSAttributedString.Key.baselineOffset, value: 2, range: NSMakeRange(0, attributeString.length))```

Swift 5-short 版本

let attributedText = NSAttributedString(
string: "Label Text",
attributes: [.strikethroughStyle: NSUnderlineStyle.single.rawValue]
)


yourLabel.attributedText = attributedText

Swift5 UILabel 扩展 。删除删除删除线有时不起作用。在这种情况下使用此代码。

extension UILabel {
func strikeThrough(_ isStrikeThrough: Bool = true) {
guard let text = self.text else {
return
}
        

if isStrikeThrough {
let attributeString =  NSMutableAttributedString(string: text)
attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: NSUnderlineStyle.single.rawValue, range: NSMakeRange(0,attributeString.length))
self.attributedText = attributeString
} else {
let attributeString =  NSMutableAttributedString(string: text)
attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: [], range: NSMakeRange(0,attributeString.length))
self.attributedText = attributeString
}
}
}