120

私はこのような文字列を持っています

var str = "@text1 this is good @text1"

text1ここで、別の文字列に置き換えますt 1。テキストを置き換えることはできますが、太字にすることはできません。新しい string を太字にしたいt 1ので、最終的な出力は次のようになります。

@t 1これは良い@t 1

どうすればいいですか?

私が見ている例はすべてObjective-Cにありますが、Swiftでやりたいです。

前もって感謝します。

4

19 に答える 19

113
var normalText = "Hi am normal"

var boldText  = "And I am BOLD!"

var attributedString = NSMutableAttributedString(string:normalText)

var attrs = [NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 15)]
var boldString = NSMutableAttributedString(string: boldText, attributes:attrs)

attributedString.append(boldString)

ラベルに割り当てたい場合:

yourLabel.attributedText = attributedString
于 2015-02-13T09:26:20.313 に答える
29

編集/更新: Xcode 13.1 • Swift 5.5.1

HTML と CSS を知っている場合は、それを使用して、属性付き文字列のフォント スタイル、色、およびサイズを次のように簡単に制御できます。

考察
HTML インポーターは、バックグラウンド スレッドから呼び出されるべきではありません (つまり、オプション ディクショナリには、値が html の documentType が含まれています)。メインスレッドとの同期を試み、失敗し、タイムアウトします。メイン スレッドから呼び出しても機能します (ただし、HTML に外部リソースへの参照が含まれている場合はタイムアウトになる可能性があり、絶対に避ける必要があります)。HTML インポート メカニズムは、一般的な HTML インポート用ではなく、マークダウン (つまり、テキスト スタイル、色など) のようなものを実装するためのものです。


extension StringProtocol {
    var html2AttStr: NSAttributedString? {
        try? NSAttributedString(data: Data(utf8), options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)

    }
}

"<style type=\"text/css\">#red{color:#F00}#green{color:#0F0}#blue{color: #00F; font-weight: Bold; font-size: 32}</style><span id=\"red\" >Red,</span><span id=\"green\" > Green </span><span id=\"blue\">and Blue</span>".html2AttStr
于 2015-02-15T23:44:39.820 に答える
10

これが私が思いついた最善の方法です。どこからでも呼び出すことができる関数を追加し、それを Constants.swift のようなクラスなしでファイルに追加すると、多くの場合、1行のコードを呼び出すだけで、任意の文字列内の単語を強調できます。

constants.swift ファイルに移動するには:

import Foundation
import UIKit

func addBoldText(fullString: NSString, boldPartOfString: NSString, font: UIFont!, boldFont: UIFont!) -> NSAttributedString {
   let nonBoldFontAttribute = [NSFontAttributeName:font!]
   let boldFontAttribute = [NSFontAttributeName:boldFont!]
   let boldString = NSMutableAttributedString(string: fullString as String, attributes:nonBoldFontAttribute)
   boldString.addAttributes(boldFontAttribute, range: fullString.rangeOfString(boldPartOfString as String))
   return boldString
}

次に、任意の UILabel に対してこの 1 行のコードを呼び出すことができます。

self.UILabel.attributedText = addBoldText("Check again in 30 DAYS to find more friends", boldPartOfString: "30 DAYS", font: normalFont!, boldFont: boldSearchFont!)


//Mark: Albeit that you've had to define these somewhere:

let normalFont = UIFont(name: "INSERT FONT NAME", size: 15)
let boldFont = UIFont(name: "INSERT BOLD FONT", size: 15)
于 2016-05-21T01:21:34.160 に答える
10

文字列を入力して、強調したいすべての部分文字列を伝えることができるように、David Westのすばらしい答えを拡張しました。

func addBoldText(fullString: NSString, boldPartsOfString: Array<NSString>, font: UIFont!, boldFont: UIFont!) -> NSAttributedString {
    let nonBoldFontAttribute = [NSFontAttributeName:font!]
    let boldFontAttribute = [NSFontAttributeName:boldFont!]
    let boldString = NSMutableAttributedString(string: fullString as String, attributes:nonBoldFontAttribute)
    for i in 0 ..< boldPartsOfString.count {
        boldString.addAttributes(boldFontAttribute, range: fullString.rangeOfString(boldPartsOfString[i] as String))
    }
    return boldString
}

そして、次のように呼び出します。

let normalFont = UIFont(name: "Dosis-Medium", size: 18)
let boldSearchFont = UIFont(name: "Dosis-Bold", size: 18)
self.UILabel.attributedText = addBoldText("Check again in 30 days to find more friends", boldPartsOfString: ["Check", "30 days", "find", "friends"], font: normalFont!, boldFont: boldSearchFont!)

これにより、指定された文字列で太字にしたいすべての部分文字列が太字になります

于 2016-08-23T18:57:28.840 に答える
2

これは役に立つかもしれません

class func createAttributedStringFrom (string1 : String ,strin2 : String, attributes1 : Dictionary<String, NSObject>, attributes2 : Dictionary<String, NSObject>) -> NSAttributedString{

let fullStringNormal = (string1 + strin2) as NSString
let attributedFullString = NSMutableAttributedString(string: fullStringNormal as String)

attributedFullString.addAttributes(attributes1, range: fullStringNormal.rangeOfString(string1))
attributedFullString.addAttributes(attributes2, range: fullStringNormal.rangeOfString(strin2))
return attributedFullString
}
于 2015-12-24T10:23:55.023 に答える
0

迅速な 4 の 2 つのライナー:

            button.setAttributedTitle(.init(string: "My text", attributes: [.font: UIFont.systemFont(ofSize: 20, weight: .bold)]), for: .selected)
            button.setAttributedTitle(.init(string: "My text", attributes: [.font: UIFont.systemFont(ofSize: 20, weight: .regular)]), for: .normal)
于 2019-09-12T00:47:20.510 に答える
-1

Prajeet Shresthaの回答を改善する: -

より少ないコードを含む NSMutableAttributedString の汎用拡張を作成できます。この場合、システム フォントを使用することにしましたが、フォント名をパラメーターとして入力できるように変更することもできます。

    extension NSMutableAttributedString {

        func systemFontWith(text: String, size: CGFloat, weight: CGFloat) -> NSMutableAttributedString {
            let attributes: [String: AnyObject] = [NSFontAttributeName: UIFont.systemFont(ofSize: size, weight: weight)]
            let string = NSMutableAttributedString(string: text, attributes: attributes)
            self.append(string)
            return self
        }
    }
于 2017-01-04T10:10:37.583 に答える