web-dev-qa-db-ja.com

NSAttributedStringは、pointSizeを変更せずにスタイルを太字に変更しますか?

IOSでNSAttributedStringsを掘り下げています。人の姓名をNSAttributesStringとして返すモデルがあります。 (モデルで属性付き文字列を処理するのが良いかどうかはわかりません!?)姓を太字で印刷するのに対し、名は通常どおりに印刷する必要があります。私が望まないのは、テキストサイズを設定することです。私がこれまでに見つけたのはこれだけです:

- (NSAttributedString*)attributedName {
    NSMutableAttributedString* name = [[NSMutableAttributedString alloc] initWithString:self.name];
    [name setAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:[UIFont systemFontSize]]} range:[self.name rangeOfString:self.lastname]];
    return name;
}

ただし、これはもちろん、姓のフォントサイズを上書きします。これにより、UITableViewCellで非常に面白い外観が得られ、名はセルのラベルの通常のテキストサイズで、最後の名前は印刷されます。名前は非常に小さく印刷されます。

私が望むことを達成する方法はありますか?

ご協力いただきありがとうございます!

16
Michael Ochs

これは、現在のフォント属性(およびテキストサイズ)を維持しながら、テキストを太字にするSwiftextensionです。

public extension UILabel {

    /// Makes the text bold.
    public func makeBold() {
        //get the UILabel's fontDescriptor
        let desc = self.font.fontDescriptor().fontDescriptorWithSymbolicTraits(.TraitBold)
        //Setting size to '0.0' will preserve the textSize
        self.font = UIFont(descriptor: desc, size: 0.0)
    }

}
4
Sakiboy

この質問 からのテクニックを使用してください:

UIFontDescriptor *fontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFontTextStyleBody];
uint32_t existingTraitsWithNewTrait = UIFontDescriptorTraitBold;
    fontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:existingTraitsWithNewTrait];
UIFont *updatedFont = [UIFont fontWithDescriptor:fontDescriptor size:0.0];
NSDictionary *attribs =  @{NSFontAttributeName : updatedFont};
[mutableAttrString setAttributes:attribs range:result.range];
3
Roman B.

文字列ラベルの2番目の単語を太字にする場合、つまり、デフォルトのiOSシステムフォント(見出し、タイトルなど)を使用しているときに名前ラベルを使用する場合

let s = "\(client.givenName) \(client.surname)" as NSString

let myAttribute = [ NSFontAttributeName: UIFont.preferredFontForTextStyle(UIFontTextStyleTitle1) ]
let myString = NSMutableAttributedString(string: "\(s)", attributes: myAttribute )

let myRange = s.rangeOfString(client.surname)
let desc = UIFont.preferredFontForTextStyle(UIFontTextStyleTitle1).fontDescriptor().fontDescriptorWithSymbolicTraits(.TraitBold)
let new = UIFont(descriptor: desc, size: 0.0)

myString.addAttribute(NSFontAttributeName, value: new, range: myRange)

nameLabel.attributedText = myString
2
DogCoffee

テーブルのセルコードから上記の呼び出しを行いますが、セルのtextLabelからフォントサイズを取得して、目的のフォントサイズを渡します。

2
rmaddy

サイズを0.0に設定してみましたか?

1

StrokeWidth属性にnegative値を設定することにより、他の属性を変更せずに文字列を太字にすることができます。

Objective-C:

[name setAttributes:@{NSStrokeWidthAttributeName : @-3.0} range:NSRangeFromString(name.string)];

迅速:

name.setAttributes([.strokeWidth: NSNumber(value: -3.0)], range: NSRangeFromString(name.string))
1
Yonat