在Xamarin表单中,如何将标签的字体设置为“中等”(系统字体)

在Xamarin表单中,如何将标签的字体设置为“中等”(系统字体),xamarin,xamarin.forms,Xamarin,Xamarin.forms,我想使用SF Pro(iOS)和Roboto(Android)这两种系统字体。两者都有介质,但我看不到任何方法来设置这些标签 我想我可能需要一个标签自定义渲染器,如有任何建议,我将不胜感激 以下是一些参考资料: 让我们从Android开始-您不能将Roboto字体设置为半粗体,因为该字体不支持此重量。链接供参考- 对于iOS,旧金山支持这个字体权重。由于您使用的是内置系统字体,只需将该值设置为。SFUIText Semibold即可 更新 由于问题的更新性质,我们可以在这里为iOS提供两种方

我想使用SF Pro(iOS)和Roboto(Android)这两种系统字体。两者都有介质,但我看不到任何方法来设置这些标签

我想我可能需要一个标签自定义渲染器,如有任何建议,我将不胜感激

以下是一些参考资料:


让我们从Android开始-您不能将
Roboto
字体设置为
半粗体
,因为该字体不支持此重量。链接供参考-

对于iOS,旧金山支持这个字体权重。由于您使用的是内置系统字体,只需将该值设置为
。SFUIText Semibold
即可

更新

由于问题的更新性质,我们可以在这里为iOS提供两种方法。你得到的警告信息说明了一切:

CoreText注意:客户端请求的名称“.SFUIText Medium”,它将获得TimesNewRomanPSMT,而不是预期的字体。所有系统UI字体访问都应通过适当的API,如CTFontCreateUIFontForLanguage()或+[UIFont systemFontOfSize:]

这意味着在渲染中,我们可以如下设置字体:

Control.Font=UIFont.SystemFontOfSize(17,uifontwweight.Medium);
警告信息还表示,可以使用
CTFont
实现,如下所示:

新的CTFont(“.SFUIText-Medium”,17);
对于iOS,最好在
SystemFontOfSize
中使用第一种方法

注意:请记住,这可能不会删除警告消息,因为它们通常是由第三方软件包引起的,这些软件包仍然引用旧的表单版本,或者字体设置不正确。如果发生这种情况,请检查您的软件包并在必要时提出问题。您可以查看修复此()的官方提交。如您所见,他们正在拆分您提供的字符串并获取最后一部分。如果最后一部分可以转换为,他们将按照我刚才描述的方式设置字体。因此,最后,如果在共享项目中提供字体为
.SFUIText Medium
,则其效果与在自定义渲染器中显式引用该字体相同,因为这两种方法最终都使用相同的代码。同样,如果警告仍然存在,您希望检查您的第三方库

这是一个包含两个结果的屏幕截图-在共享项目中设置字体和使用渲染器设置字体:

对于Android,您可以再次在渲染器中设置字体。在这里,您需要为这一个定制样式。在Android项目中,在
Resources/values/styles.xml
中创建一个新样式,如下所示:


无衬线介质
#333333
17便士
你可以在这里定制很多,但是对于这个示例,我只是添加了系列、尺寸和颜色

然后,在渲染器中,只需更改控件的
文本外观

Control.settext外观(Resource.Style.FontRobotoMedium);
请记住,在没有任何渲染器使用系统内置字体的情况下也可以实现这一点,如下所示:


有关Android系统字体的参考,请参阅

注意:请记住,Android系统的字体也会经常更改,因此同样不建议使用这种字体。我提到的
font.xml
文件开头有一个巨大的警告:

警告:不支持第三方应用解析此文件。这个 文件及其引用的字体文件将被重命名和/或移出 在下一个Android版本中从各自的位置,和/或 文件的格式或语法可能会发生重大变化。如果你分析这个 文件有关系统字体的信息,请自行承担风险。你的 该应用程序几乎肯定会与下一代主流Android系统决裂 释放

这是一个包含两个结果的屏幕截图-在共享项目中设置字体和使用渲染器设置字体: 注意:字体延迟了一点,因为文本填充略有不同,可以按照如下样式进行调整:

1dip
总之,可以使用自定义渲染器执行的操作也可以在共享项目中执行。在所有代码下,来自Xamarin的团队所做的与来自定制渲染器的代码非常相似(如果不是相同的话)。不要期望所有警告都消失,因为如果任何第三方库没有取消对最新表单的分级,或者错误地使用系统字体,警告仍然会出现

同样,尝试使用系统字体确实不是一个好的实践。它们被保留(在iOS的情况下——隐藏在点(.)名称后面)是有原因的。在一次或两次更新中,字体可能会更改,并会破坏应用程序的外观。如果您没有任何明确的理由不导入字体文件,我强烈建议您导入字体文件,并参考它们的族。如果仍要使用系统字体,则可以在不使用任何渲染器的情况下实现这一点。对于iOS,只需将该系列设置为
.SFUIText Medium
,对于Android-设置为
sans serif Medium
(两者都在共享项目中)

更新2

假设您将在共享项目中将族设置为枚举。枚举可以如下所示:

公共枚举FontFamilyType
{
轻,,
有规律的
中等
}
您可以在
CustomLabel
包装中添加一个附加属性-例如

公共FontFamilyType FontFamilyType{get;set;} 如有必要,可以将其设置为可绑定属性

这里有两个渲染器,可以将字体更改为常规、浅色和中等。对于iOS:

[程序集:ExportRenderer(typeof(CustomLabel)、typeof(CustomLabelRenderer))]
命名空间fontrenders.iOS
{
公共类CustomLabelRenderer:LabelRenderer
{
受保护的覆盖无效OnElemen
public class customLabel : Label{

    public int myFont { get; set; }
}
<StackLayout>
    <!-- Place new controls here -->
    <Label Text="Welcome to Xamarin.Forms!" 
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />

    <app307:customLabel Text="testText" myFont="15"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />
</StackLayout>
[assembly: ExportRenderer (typeof(customLabel), typeof(MyLabelRenderer))]
namespace App307.iOS
{
    public class MyLabelRenderer : LabelRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);

            int fontSize = 18;

            if (e.NewElement != null)
            {
                customLabel label = e.NewElement as customLabel;

                fontSize = label.myFont;
            }

            if (Control != null)
            {
       
                UIFont font = UIFont.SystemFontOfSize(fontSize, UIFontWeight.Medium);
                Control.Font = font;
            }
        }
    }
}