NSAttributedString将样式更改为粗体而不更改pointSize?

时间:2012-10-19 12:15:31

标签: iphone ios ipad uifont nsattributedstring

我正在挖掘iOS上的NSAttributedString。我有一个模型,正在将人姓氏和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中给出非常有趣的外观,其中第一个名称将以单元格标签的常规文本大小打印出来,姓氏将打印得非常小。

有没有办法达到我想要的目的?

感谢您的帮助!

6 个答案:

答案 0 :(得分:4)

这是一个Swift extension,它使文字变为粗体,同时保留当前的字体属性(和文字大小)。

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)
    }

}

答案 1 :(得分:3)

使用this question中的技巧:

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

答案 2 :(得分:2)

从表格单元格代码进行上述调用,但通过从单元格的textLabel获取字体大小来传递所需的字体大小。

答案 3 :(得分: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

答案 4 :(得分:2)

您可以通过将StrokeWidth属性设置为值来加粗字符串而不更改其其他属性。

Objective-C:

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

迅速:

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

答案 5 :(得分:1)

您是否尝试将尺寸设为0.0?