Многострочная атрибутированная строка с зачеркиванием
У меня есть ярлык с:
label.numberOfLines = 0
И я пытаюсь сделать текст этого ярлыка зачеркнутым:
let index: NSMutableAttributedString = NSMutableAttributedString(string: label.text!)
index.addAttributes([NSStrikethroughStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue, NSStrikethroughColorAttributeName: UIColor.red], range: NSMakeRange(0, index.length))
label.textColor = UIColor.red
label.attributedText = index
Правда ли, что атрибутивная строка не работает с мультилиниями или с метками с numberOfLines, установленным в 0? И если да, то как сделать зачеркнутый текст?
4 ответа
Решение
Я придумал два решения. Они основаны на ответе @SivajeeBattina.
Первый - вычеркнуть текст с помощью http://adamvarga.com/strike/.
private func returnStrikedOutTextFromString(_ str: String) -> String {
var newString = ""
let normal = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя "
let strikethrough = "А̶Б̶В̶Г̶Д̶Е̶Ё̶Ж̶З̶И̶Й̶К̶Л̶М̶Н̶О̶П̶Р̶С̶Т̶У̶Ф̶Х̶Ц̶Ч̶Ш̶Щ̶Ъ̶Ы̶Ь̶Э̶Ю̶Я̶а̶б̶в̶г̶д̶е̶ё̶ж̶з̶и̶й̶к̶л̶м̶н̶о̶п̶р̶с̶т̶у̶ф̶х̶ц̶ч̶ш̶щ̶ъ̶ы̶ь̶э̶ю̶я̶ ̶̶"
for i in 0..<str.characters.count {
let range: Range<String.Index> =
normal.range(of: str
.substring(to: str.index(str.startIndex, offsetBy: i + 1))
.substring(from: str.index(str.startIndex, offsetBy: i)))!
let index: Int = normal.distance(from: normal.startIndex, to: range.lowerBound)
newString = String(format: "%@%@", newString,
NSLocalizedString(strikethrough
.substring(to: strikethrough.index(strikethrough.startIndex, offsetBy: index + 1))
.substring(from: strikethrough.index(strikethrough.startIndex, offsetBy: index)),
comment: ""))
}
return newString
}
Прекрасно работает с многострочным, если вы добавили NSBaselineOffsetAttributeName раньше:
let attributeString: NSMutableAttributedString = NSMutableAttributedString(string: (object?.title)!)
attributeString.addAttribute(NSBaselineOffsetAttributeName, value: 0, range: NSMakeRange(0, attributeString.length))
attributeString.addAttribute(NSStrikethroughStyleAttributeName, value: 2, range: NSMakeRange(0, attributeString.length))
Ваш код должен быть как,
let index: NSMutableAttributedString = NSMutableAttributedString(string: lbl.text!)
index.addAttributes([NSStrikethroughStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue, NSStrikethroughColorAttributeName: UIColor.red], range: NSMakeRange(0, index.length))
lbl.textColor = UIColor.red
lbl.attributedText = index
так как index
ваша изменчивая строка! не название!
И вы не можете использовать strike through
с multi line
этикетка.
Если ты хочешь strike through
эффект в несколько строк, то вы можете использовать UITextView
вместо ярлыка!
Напишите это как,
self.label.numberOfLines = 0
let attributeString: NSMutableAttributedString = NSMutableAttributedString(string: self.label.text!)
attributeString.addAttribute(NSStrikethroughStyleAttributeName, value: 1, range: NSMakeRange(0, attributeString.length))
self.label.attributedText = attributeString
Работаю на моем конце.