web-dev-qa-db-ja.com

Swift 3 NSAttributedString複数の属性

ちょうど始めましたSwift 3と私はSwift構文に問題があります。

単純なNSAttributedStringを表示しようとしています。

最初に属性を設定します:

let attributeFontSaySomething : [String : AnyObject] = [NSFontAttributeName : UIFont.fontSaySomething()]
let attributeColorSaySomething : [String : AnyObject] = [NSForegroundColorAttributeName : UIColor.blue]

次に、文字列を作成します:

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: self.attributeFontSaySomething)

私がやりたいのは、1つだけでなく2つの属性を持つ文字列を作成することです。しかし、私がするとき:

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: [self.attributeFontSaySomething, self.attributeColorSaySomething])

Xcodeは、リテラル辞書用にこれを変更することはできず、変更してほしいと言っています。

NSMutableAttributedStringを使用せずに2つの属性を持つ文字列を作成するにはどうすればよいですか?

14
user2206906

主な問題は、array[attr.. , attr...] 1つではなく辞書

2つの辞書を1つに統合する必要があります

let attributeFontSaySomething : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 12.0)]
let attributeColorSaySomething : [String : Any] = [NSForegroundColorAttributeName : UIColor.blue]

var attributes = attributeFontSaySomething
for (key, value) in attributeColorSaySomething {
    attributes(value, forKey: key)
}

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: attributes)

ただし、辞書を文字通り作成する方が簡単な場合があります。

let attributes : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 12.0), NSForegroundColorAttributeName : UIColor.blue]
23
vadian

両方の属性セットを持つ単一の辞書を作成するだけです:

let attributes: [String:AnyObject] = 
  [NSFontAttributeName : UIFont.fontSaySomething(), 
  NSForegroundColorAttributeName : UIColor.blue]

そして、属性付き文字列を作成するときに、キーと値の両方のペアで辞書を使用します。

Swift辞書を結合するための組み込みメカニズムはありませんが、辞書を一緒に追加できるようにしたい場合は、+演算子のオーバーライドを追加できます。ただし、両方のディクショナリに同じキーが含まれている場合の対処方法を理解するため)

7
Duncan C

@ vadianの回答に感謝

Swift 4の更新

let attributes : [NSAttributedStringKey : Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue) : UIFont.systemFont(ofSize: 12.0), NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue) : UIColor(hex:"4C0000")]

refreshControl.attributedTitle=NSAttributedString(string: "Refreshing...", attributes: attributes)
2
Baljeet Singh

次のように使用します。

let attStringSaySomething = NSAttributedString.init(string: "Hello", attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 16), NSForegroundColorAttributeName:UIColor.black])
1
Poles

Robotoフォントを使用して、さまざまな文字列のさまざまな属性にこのコードを使用できます(Robotoフォント use MDFRobotoFontLoader

let yourAttributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: MDFRobotoFontLoader.sharedInstance().regularFont(ofSize: 20)]

let finalString =  NSMutableAttributedString(string: "", attributes: yourAttributes)

let attributeStr =  NSMutableAttributedString(string: "XYZGFDGii", attributes: yourAttributes)
       finalString.append(attributeStr)

let yourOtherAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: MDFRobotoFontLoader.sharedInstance().regularFont(ofSize: 24)]

let partTwo = NSMutableAttributedString(string: "hfjghlkdhkjld", attributes: yourOtherAttributes)
       finalString.append(partTwo)

この例ではRobotoフォントを使用します

1

問題は、[String: Any]型ではなく、[[String: Any], [String: Any]]のみを想定している2つの辞書を辞書に挿入していることです。次のことができます。

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: [NSFontAttributeName : UIFont.fontSaySomething(), NSForegroundColorAttributeName : UIColor.blue])

値を辞書ではなくタプルにグループ化し、キーと値に基づいて辞書に挿入することもできます。

let attributeFontSaySomething = (key: NSFontAttributeName, value: UIFont.fontSaySomething())
let attributeColorSaySomething = (key: NSForegroundColorAttributeName, value: UIColor.blue)

let attStringSaySomething = NSAttributedString(string: "Say something", attributes: [attributeFontSaySomething.key : attributeFontSaySomething.value,attributeColorSaySomething.key : attributeColorSaySomething.value])
0
dirtydanee