C# Xamarin iOS中为iOS字体描述符添加非粗体自定义字重
问题描述
我为使用“SF Pro Display”字体创建了自定义渲染器,使用UIFont.SystemFontOfSize(size , weight)时得到的输出为.SFUI-weight。以下是我使用的自定义字体代码:
var descriptor = new UIFontDescriptor().CreateWithFamily("SF Pro Display"); if ((attributes & FontAttributes.Bold) != 0) { var traits = (UIFontDescriptorSymbolicTraits) 0; traits = traits | UIFontDescriptorSymbolicTraits.Bold; descriptor = descriptor.CreateWithTraits(traits); Control.Font = UIFont.FromDescriptor(descriptor, (nfloat) label.FontSize); }
目前的问题是FontAttributes和UIFontDescriptorSymbolicTraits仅提供Bold、Italic选项,而我需要Semibold、Medium、Regular等字重。查阅过类似问题,但解决方案均为Swift语言,且C#中没有对应的内置方法。通过上述代码我已实现SFProDisplay-Bold,希望同样实现SFProDisplay-Medium等效果。
解决方案
方法1:直接通过字体全名创建
如果已确认项目中导入了对应字重的SF Pro Display字体文件(比如SFProDisplay-Medium.ttf、SFProDisplay-Semibold.ttf等),可直接通过字体全名创建UIFont:
// 创建Medium字重的字体 Control.Font = UIFont.FromName("SFProDisplay-Medium", (nfloat)label.FontSize); // 创建Semibold字重的字体 Control.Font = UIFont.FromName("SFProDisplay-Semibold", (nfloat)label.FontSize); // 创建Regular字重的字体 Control.Font = UIFont.FromName("SFProDisplay-Regular", (nfloat)label.FontSize);
注意:需确保字体已正确添加到项目的Info.plist中,在UIAppFonts数组里声明所有导入的字体文件名。
方法2:通过UIFontDescriptor的字重属性设置
如果需要动态设置字重,可利用UIFontDescriptor.AttributeName.Weight属性,传入对应字重的数值(iOS系统定义的常用字重数值:Regular=0,Medium=0.23,Semibold=0.36,Bold=0.4等):
// 定义字重与对应数值的映射 var weightMap = new Dictionary<string, nfloat> { {"Regular", 0f}, {"Medium", 0.23f}, {"Semibold", 0.36f}, {"Bold", 0.4f} }; // 示例:创建Medium字重的字体描述符 var attributeDict = new NSMutableDictionary(); attributeDict.SetValueForKey(new NSNumber(weightMap["Medium"]), UIFontDescriptor.AttributeName.Weight); attributeDict.SetValueForKey(new NSString("SF Pro Display"), UIFontDescriptor.AttributeName.Family); var descriptor = new UIFontDescriptor(attributeDict); Control.Font = UIFont.FromDescriptor(descriptor, (nfloat)label.FontSize);
这种方式无需依赖字体全名,通过系统字重映射匹配对应字体文件,兼容性更强。
补充验证方式
若不确定字体的正确名称,可通过以下代码遍历确认:
// 遍历所有字体家族 foreach (var family in UIFont.FamilyNames) { if (family == "SF Pro Display") { // 输出该家族下的所有可用字体名称 foreach (var fontName in UIFont.FontNamesForFamilyName(family)) { Console.WriteLine(fontName); } } }
内容的提问来源于stack exchange,提问作者Ruchira
相关产品推荐
相关产品推荐

