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