取り消し線付きのUILabelを作成するにはどうすればよいですか?


120

こんなUILabel感じの文章を作りたい

ここに画像の説明を入力してください

これどうやってするの?テキストが小さい場合、行も小さくする必要があります。



iOS 6のサポートのみが必要な場合は、NSAttributedStringおよびUILabel attributedTextプロパティを使用してこれを行うことができます。
rmaddy 2012年

ボタンのテキストの取り消しを行うことは可能ですか
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)

Objective-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これを実行します。1つはTTTAttributedLabelで、もう1つはOHAttributedLabelです。


iOS 5.1.1以前のバージョンの場合、サードパーティの属性付きラベルを使用して属性付きテキストを表示するにはどうすればよいですか?
Devの

良いチュートリアルを提案できますか?あなたが提供したリンクは少しわかりづらいです.. :(
Dev

私はiOS用のサードパーティ起因するラベルを作成するために何をすべきかを説明することができます
Devの

@ 2とは?マジックナンバー?
ベンシンクレア2014年

7
あなたはそれをコミットするのを忘れたと思います。@ 2の代わりにNSUnderlineStyleの適切な値を使用する必要があります。私はここで少し知識を持っています。
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

取り消し線パターン(スタイルとORで結合):

  • 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

他の方法は、文字列拡張拡張を使用することです

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月更新


私にはうまくいきません。プルネンドゥ・ロイの答えは私にとって仕事です。唯一の違いは、あなたがvalue 0パスインし、プルネンドゥロイパスを渡すことです。value: NSUnderlineStyle.styleSingle.rawValue
kuzdu

@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

styleSingle、styleThick、styleDoubleなどの「strikethroughStyle」を変更できます ここに画像の説明を入力してください


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

テーブルビューセル(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

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

パーティーに遅れるかもしれない。

とにかく、私は知っていますNSMutableAttributedStringが、最近は少し異なるアプローチで同じ機能を実現しました。

  • 高さ= 1のUIViewを追加しました。
  • UIViewの先頭と末尾の制約をラベルの先頭と末尾の制約と一致させた
  • ラベルの中央にUIViewを配置しました

上記の手順をすべて実行した後、私のラベル、UIView、およびその制約は下の画像のようになりました。

ここに画像の説明を入力してください


スマートなソリューション👍
ダニア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

テキストプロパティを属性付きに変更してテキストを選択し、右クリックしてフォントプロパティを取得します。取り消し線をクリックします。 スクリーンショット


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

NSStrikethroughStyleAttributeNameがNSAttributedStringKey.strikethroughStyleに変更されているため、これはSwift 4で使用できます。

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および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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.