我一直在尝试将NSFontAttributes的组合最近应用到NSMutableAttributedString,我根本找不到如何在不删除其他属性的情况下进行彻底的解释.
我搜索了一堆,发现这个问题与如何用HTML做,然后这个问题关于如何找到文本加粗或斜体的地方,但没有关于如何实际做到这一点.
目前,我尝试按如下方式格式化蜇:
斜体字:
[mutableAttributedString addAttribute: NSFontAttributeName value:[fontAttributes valueForKey:CXItalicsFontAttributeName] range:r];
胆大: [mutableAttributedString addAttribute:NSFontAttributeName value:[fontAttributes valueForKey:CXBoldFontAttributeName] range:r];
其中常量CXItalicsFontAttributeName
并CXBoldAttributeName
从字典中提取以下两个值:
UIFont *italicsFont = [UIFont fontWithName:@"Avenir-BookOblique" size:14.0f]; UIFont *boldFont = [UIFont fontWithName:@"Avenir-Heavy" size:14.0f];
我知道这不一定是正确的格式化方法,因为NSAttributedString 标准属性不包括ItalicsFontAttribute或BoldFontAttribute,但我找不到正确的方法来执行此操作.任何人都可以帮我吗?
在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()) ]) }
如果您单独应用每个(粗体或斜体)特征,则需要确保粗体和斜体范围不重叠或一个特征将覆盖另一个特征.
将粗体和斜体特征应用于范围的唯一方法是使用粗体和斜体字体,并同时应用这两个特征.
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))
到目前为止,我的问题的最佳解决方案是利用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
这里的优点是我不再需要自己创建单独的字体类型,并且来自该系列的字体就足够了.