我一直在尝试将NSFontAttributes的组合最近应用到NSMutableAttributedString,我根本找不到如何在不删除其他属性的情况下进行彻底的解释。
我搜索了一堆,发现这个question有关如何用HTML做,然后这个question关于如何找到文本加粗或斜体的地方,但没有关于如何实际做到这一点。
目前,我尝试按如下方式格式化蜇:
斜体:[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 standard attributes不包含ItalicsFontAttribute或BoldFontAttribute,但我找不到正确的方法来执行此操作。任何人都可以帮我吗?
如果您单独应用每个(粗体或斜体)特征,则需要确保粗体和斜体范围不重叠或一个特征将覆盖另一个特征。
将粗体和斜体特征应用于范围的唯一方法是使用粗体和斜体字体,并同时应用这两个特征。
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))
在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()) ])
}
到目前为止,我的问题的最佳解决方案是利用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
这里的优点是我不再需要自己创建单独的字体类型,并且来自该系列的字体就足够了。
结帐NSAttributedString.Key.obliqueness
。将此键的值设置为0以外的值会使文本以不同的程度斜体。