NSAttributedString:设置 FontAttributes 不会更改字体
NSAttributedString: Setting FontAttributes doesn't change font
我正在尝试更改 NSAttributedString 上的字体。
我有一个方法可以遍历每个字符,并为该字符创建一个新的 NSFontAttribute 字典。然而,最后,字符串保持不变。为了演示,这是我设置字符串的方式:
UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Avenir-Book" size:14.0f];
NSDictionary *fontAttributes = [fontDescriptor fontAttributes];
[fontAttributes setValue:[NSString stringWithFormat:@"%u",[fontDescriptor symbolicTraits]] forKey:UIFontSymbolicTrait];
[mutableAttributedString setAttributes:fontAttributes range:(NSRange){0,length}];
这会为整个字符串生成以下 NSFontAttribute 字典:
Font Attributes: {
NSCTFontSymbolicTrait = 2147483648;
NSFontNameAttribute = "Avenir-Book";
NSFontSizeAttribute = 14;
}
我检查并修改每个字符的 FontAttribute 以添加粗体或斜体,如下所示:
for (int i = (int)range.location; i < (range.location + range.length); i++){
/* Extract Font Attributes */
NSDictionary *extractedAttributes = [[mutableAttributedString attributesAtIndex:i effectiveRange:NULL]mutableCopy];
/* Determine New Trait */
uint newTrait = ((uint)[[extractedAttributes valueForKey:UIFontSymbolicTrait]longLongValue] | [self symbolicTraitForMarkdownType:markdown]); // (markDown is a mask)
/* Set New Trait */
[extractedAttributes setValue:[NSString stringWithFormat:@"%u",newTrait] forKey:UIFontSymbolicTrait];
/* Create New Font Descriptor */
UIFontDescriptor *newDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:extractedAttributes];
newDescriptor = [newDescriptor fontDescriptorWithSymbolicTraits:newTrait];
/* Apply Font Descriptor */
[mutableAttributedString setAttributes:[newDescriptor fontAttributes] range:(NSRange){i,1}];
}
这会产生许多不同的 FontAttributes:
Index 1: {
NSCTFontSymbolicTrait = 2147483650;
NSFontNameAttribute = "Avenir-Black";
NSFontSizeAttribute = 14;
}
Index 2: {
NSCTFontSymbolicTrait = 2147483651;
NSFontNameAttribute = "Avenir-BlackOblique";
NSFontSizeAttribute = 14;
}
然而,NSAttributedString 本身保持完全不变。它仍然是默认字体。我怎样才能让它反映我对其属性所做的更改?
解决方法如下:
1: UIFontDescriptor
的文档将键:UIFontDescriptorNameAttribute
定义为一个 NSString
实例,它就是这样。
2: NSAttributedString
的文档将键:NSFontAttributeName
定义为 UIFont
实例。
因此,从使用以下方法初始化的 UIFontDescriptor
获取 fontAttributes
字典:(UIFontDescriptor *)fontDescriptorWithName:(NSString *)fontName size:(CGFloat)size
将仅设置键 UIFontDescriptorNameAttribute
和 UIFontDescriptorSizeAttribute
。但是,如果您希望实际修改 NSAttributedString 的字体,则需要应用属性并将 UIFont 实例保存到键 NSFontAttributeName
。
这就是混乱的来源。但是,应该注意的是,您实际上可以使用键 NSFontAttributeName
从 UIFontDescriptor 实例的 fontAttributes 字典中获取 UIFontDescriptorNameAttribute
。这也可能令人困惑。
我正在尝试更改 NSAttributedString 上的字体。
我有一个方法可以遍历每个字符,并为该字符创建一个新的 NSFontAttribute 字典。然而,最后,字符串保持不变。为了演示,这是我设置字符串的方式:
UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Avenir-Book" size:14.0f];
NSDictionary *fontAttributes = [fontDescriptor fontAttributes];
[fontAttributes setValue:[NSString stringWithFormat:@"%u",[fontDescriptor symbolicTraits]] forKey:UIFontSymbolicTrait];
[mutableAttributedString setAttributes:fontAttributes range:(NSRange){0,length}];
这会为整个字符串生成以下 NSFontAttribute 字典:
Font Attributes: {
NSCTFontSymbolicTrait = 2147483648;
NSFontNameAttribute = "Avenir-Book";
NSFontSizeAttribute = 14;
}
我检查并修改每个字符的 FontAttribute 以添加粗体或斜体,如下所示:
for (int i = (int)range.location; i < (range.location + range.length); i++){
/* Extract Font Attributes */
NSDictionary *extractedAttributes = [[mutableAttributedString attributesAtIndex:i effectiveRange:NULL]mutableCopy];
/* Determine New Trait */
uint newTrait = ((uint)[[extractedAttributes valueForKey:UIFontSymbolicTrait]longLongValue] | [self symbolicTraitForMarkdownType:markdown]); // (markDown is a mask)
/* Set New Trait */
[extractedAttributes setValue:[NSString stringWithFormat:@"%u",newTrait] forKey:UIFontSymbolicTrait];
/* Create New Font Descriptor */
UIFontDescriptor *newDescriptor = [UIFontDescriptor fontDescriptorWithFontAttributes:extractedAttributes];
newDescriptor = [newDescriptor fontDescriptorWithSymbolicTraits:newTrait];
/* Apply Font Descriptor */
[mutableAttributedString setAttributes:[newDescriptor fontAttributes] range:(NSRange){i,1}];
}
这会产生许多不同的 FontAttributes:
Index 1: {
NSCTFontSymbolicTrait = 2147483650;
NSFontNameAttribute = "Avenir-Black";
NSFontSizeAttribute = 14;
}
Index 2: {
NSCTFontSymbolicTrait = 2147483651;
NSFontNameAttribute = "Avenir-BlackOblique";
NSFontSizeAttribute = 14;
}
然而,NSAttributedString 本身保持完全不变。它仍然是默认字体。我怎样才能让它反映我对其属性所做的更改?
解决方法如下:
1: UIFontDescriptor
的文档将键:UIFontDescriptorNameAttribute
定义为一个 NSString
实例,它就是这样。
2: NSAttributedString
的文档将键:NSFontAttributeName
定义为 UIFont
实例。
因此,从使用以下方法初始化的 UIFontDescriptor
获取 fontAttributes
字典:(UIFontDescriptor *)fontDescriptorWithName:(NSString *)fontName size:(CGFloat)size
将仅设置键 UIFontDescriptorNameAttribute
和 UIFontDescriptorSizeAttribute
。但是,如果您希望实际修改 NSAttributedString 的字体,则需要应用属性并将 UIFont 实例保存到键 NSFontAttributeName
。
这就是混乱的来源。但是,应该注意的是,您实际上可以使用键 NSFontAttributeName
从 UIFontDescriptor 实例的 fontAttributes 字典中获取 UIFontDescriptorNameAttribute
。这也可能令人困惑。