【问题标题】:NSAttributedString change style to bold without changing pointSize?NSAttributedString 将样式更改为粗体而不更改 pointSize?
【发布时间】:2012-10-10 01:27:00
【问题描述】:

我正在深入研究 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 中看起来非常有趣,其中名字将以单元格标签的常规文本大小打印,最后一个name 会打印得很小。

有什么方法可以实现我想要的吗?

感谢您的帮助!

【问题讨论】:

    标签: iphone ios ipad uifont nsattributedstring


    【解决方案1】:

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

    目标-C:

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

    斯威夫特:

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

    【讨论】:

    • 但是,例如,当您在 TextEdit 中的某些文本上选择“粗体”时,这是 Cocoa 定义的“粗体”吗?它看起来会一样吗? -3.0 值是什么意思?是否将文本水平“涂抹”了 3 个点?
    • 对我来说看起来一样...文字清晰且没有涂抹 - 自己试试看。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案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];
      

      【讨论】:

      • 在 MacOS 中,preferredFontDescriptorWithTextStyle 仅在 MacOS 11 及更高版本中可用 - 因此对于需要支持 MacOS 10.13 及更高版本的应用程序,我们不能依赖它。什么是替代方案?那些“系统样式”现在在 Interface-Builder 中已经很老了 --- 如果没有新的 API,如何以编程方式访问它们?
      【解决方案4】:

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

      【讨论】:

      • 我试过了,但是一个全新且干净的初始化 UITableViewCell 为 textLabel 返回了pointSize 0.0f(可能是字体甚至 textLabel 为空)!关于如何解决这个问题的任何想法?
      • 如果你实现tableView:willDisplayCellAtIndexPath:委托方法,应该设置字体,你可以在那里更新你的字体。
      【解决方案5】:

      您是否尝试将大小设置为 0.0?

      【讨论】:

        【解决方案6】:

        如果您只想在字符串标签中加粗第二个单词,即使用默认 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
        

        【讨论】:

        • 你有机会在 Obj-C 中分享这个版本吗?
        • 你知道MacOS有没有这样的API? NSFont 和朋友会提供这样的设施吗?
        猜你喜欢
        • 2019-04-01
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        • 2021-08-13
        • 2019-08-24
        • 2017-09-29
        相关资源
        最近更新 更多