当前位置:  开发笔记 > 前端 > 正文

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

如何解决《如何将粗体和斜体应用于NSMutableAttributedString范围?》经验,为你挑选了3个好方法。

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

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

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

斜体字: [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 标准属性不包括ItalicsFontAttribute或BoldFontAttribute,但我找不到正确的方法来执行此操作.任何人都可以帮我吗?



1> nyg..:

在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()) ])
}



2> 小智..:

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

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

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

在此输入图像描述



3> Micrified..:

到目前为止,我的问题的最佳解决方案是利用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

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

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有