如何将粗体和斜体应用于NSMutableAttributedString范围?

问题描述 投票:13回答:3

我一直在尝试将NSFontAttributes的组合最近应用到NSMutableAttributedString,我根本找不到如何在不删除其他属性的情况下进行彻底的解释。

我搜索了一堆,发现这个question有关如何用HTML做,然后这个question关于如何找到文本加粗或斜体的地方,但没有关于如何实际做到这一点。

目前,我尝试按如下方式格式化蜇:

斜体:[mutableAttributedString addAttribute: NSFontAttributeName value:[fontAttributes valueForKey:CXItalicsFontAttributeName] range:r];

大胆:[mutableAttributedString addAttribute:NSFontAttributeName value:[fontAttributes valueForKey:CXBoldFontAttributeName] range:r];

常量CXItalicsFontAttributeNameCXBoldAttributeName尊重地从字典中提取以下两个值:

UIFont *italicsFont = [UIFont fontWithName:@"Avenir-BookOblique" size:14.0f];
UIFont *boldFont = [UIFont fontWithName:@"Avenir-Heavy" size:14.0f];

我知道这不是正确的格式化方法,因为NSAttributedString standard attributes不包含ItalicsFontAttribute或BoldFontAttribute,但我找不到正确的方法来执行此操作。任何人都可以帮我吗?

ios objective-c nsstring nsmutableattributedstring
3个回答
7
投票

如果您单独应用每个(粗体或斜体)特征,则需要确保粗体和斜体范围不重叠或一个特征将覆盖另一个特征。

将粗体和斜体特征应用于范围的唯一方法是使用粗体和斜体字体,并同时应用这两个特征。

let str = "Normal Bold Italics BoldItalics"

let font = UIFont(name: "Avenir", size: 14.0)!
let italicsFont = UIFont(name: "Avenir-BookOblique", size: 14.0)!
let boldFont = UIFont(name: "Avenir-Heavy", size: 14.0)!
let boldItalicsFont = UIFont(name: "Avenir-HeavyOblique", size: 14.0)!

let attributedString = NSMutableAttributedString(string: str, attributes: [NSFontAttributeName : font])
attributedString.addAttribute(NSFontAttributeName, value: boldFont, range: NSMakeRange(7, 4))
attributedString.addAttribute(NSFontAttributeName, value: italicsFont, range: NSMakeRange(12, 7))
attributedString.addAttribute(NSFontAttributeName, value: boldItalicsFont, range: NSMakeRange(20, 11))

enter image description here


12
投票

在Swift中并使用扩展名:

extension UIFont {

    func withTraits(_ traits: UIFontDescriptorSymbolicTraits) -> UIFont {

        // create a new font descriptor with the given traits
        if let fd = fontDescriptor.withSymbolicTraits(traits) {
            // return a new font with the created font descriptor
            return UIFont(descriptor: fd, size: pointSize)
        }

        // the given traits couldn't be applied, return self
        return self
    }

    func italics() -> UIFont {
        return withTraits(.traitItalic)
    }

    func bold() -> UIFont {
        return withTraits(.traitBold)
    }

    func boldItalics() -> UIFont {
        return withTraits([ .traitBold, .traitItalic ])
    }
}

例:

if let font = UIFont(name: "Avenir", size: 30) {
    let s = NSAttributedString(string: "Hello World!", attributes: [ NSFontAttributeName: font.italic() ])
    let t = NSAttributedString(string: "Hello World!", attributes: [ NSFontAttributeName: font.boldItalic()) ])
}

6
投票

到目前为止,我的问题的最佳解决方案是利用UIFontDescriptor类为我遇到的每个案例提供必要的UIFont

例如,因为我想使用Avenir-Book作为我的主要字体14,我可以创建一个UIFontDescriptor如下:

UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Avenir-Book" size:14.0f];

接下来,如果我希望获得Italicized,Bolded或两者的组合,我可以如下操作:

NSString *normalFont = [[fontDescriptor fontAttributes]valueForKey:UIFontDescriptorNameAttribute];
NSString *italicsFont = [[[fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]fontAttributes]valueForKey:UIFontDescriptorNameAttribute];
NSString *boldFont = [[[fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]fontAttributes]valueForKey:UIFontDescriptorNameAttribute];
NSString *boldAndItalicsFont = [[[fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic]fontAttributes]valueForKey:UIFontDescriptorNameAttribute];

这确实在打印时产生了所需的字体:

NSLog(@"Normal Font: %@ Size: %@\n",normalFont,[[fontDescriptor fontAttributes]valueForKey:UIFontDescriptorSizeAttribute]);
NSLog(@"Italics Font: %@\n",italicsFont);
NSLog(@"Bold Font: %@\n",boldFont);
NSLog(@"Bold and Italics Font: %@\n",boldAndItalicsFont);

输出:

Normal Font: Avenir-Book Size: 14
Italics Font: Avenir-BookOblique
Bold Font: Avenir-Black
Bold and Italics Font: Avenir-BlackOblique

这里的优点是我不再需要自己创建单独的字体类型,并且来自该系列的字体就足够了。


1
投票

结帐NSAttributedString.Key.obliqueness。将此键的值设置为0以外的值会使文本以不同的程度斜体。

© www.soinside.com 2019 - 2024. All rights reserved.