Як я можу створити 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)

Ціль-С

В 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 Reference Reference.

значення : значення атрибута, пов'язане з ім'ям.

aRange : Діапазон символів, до якого застосовується вказаний параметр атрибут / значення.

Тоді

yourLabel.attributedText = attributeString;

Для цього lesser than iOS 6.0 versionsвам потрібно 3-rd party componentце зробити. Один з них - TTTAttributedLabel , інший - OHAttributedLabel .


Як для iOS 5.1.1 меншої версії, як я можу використовувати мітку, приписану стороною, для відображення атрибутованого тексту:?
Дев

Чи можете ви запропонувати хороший підручник? Посилання, яке ви надали, трохи важко зрозуміти .. :(
Dev

Чи можете ви пояснити, що я повинен зробити, щоб створити сторонню етикетку для ios
Dev

Що таке @ 2? Чарівне число?
Бен Сінклер

7
Я думаю, ти забув це зробити. Ви повинні використовувати належне значення від NSUnderlineStyle замість @ 2. Я тут трохи педантичний.
Бен Сінклер

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

Накреслені візерунки (бути OR-ed зі стилем):

  • 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];

Константи для визначення як 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

Прорив у 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

ШВИДКИЙ КОД

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 року
Кредит на @kuzdu - оновлення серпня 2018 року


Не працює для мене. Відповідь Пурненду Роя працює для мене. Єдина відмінність полягає в тому, що ви проїжджаєте value 0та проїжджаєте через value: NSUnderlineStyle.styleSingle.rawValue
Пурненду

@kuzdu смішно, що моя відповідь була ще в грудні 2017 року, вона працює назад, тоді він просто скопіював мій код і додав NSUnderlineStyle.styleSingle.rawValue ^ - ^ Але немає проблем, я оновлю цю відповідь лише для того, щоб зробити тебе щасливим
Мухаммад Асіраф

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 в iOS Swift. Запросіть спробувати це працює для мене

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

Ви можете змінити свій "перекреслений стиль", як 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 - це товщина лінії, що прокреслює текст. Чим більше значення, тим товща лінія, що перекреслює текст
Володимир Пчеляков

4

Для всіх, хто шукає, як це зробити у комірці viewview (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але останнім часом я досяг тієї ж функціональності, дещо інший підхід.

  • Я додав UIView з висотою = 1.
  • Збіг провідних і кінцевих обмежень UIView з провідними та кінцевими обмеженнями мітки
  • Вирівняли UIView в центрі мітки

Після виконання всіх вищезазначених кроків мій Label, UIView та його обмеження виглядали нижче зображення.

введіть тут опис зображення


розумне рішення 👍
Данія Дельбані

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

Створіть розширення 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!")

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.