You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:22:28