为啥使用 Xamarin Forms 的 iOS 应用程序不显示 Font Awesome?

Posted

技术标签:

【中文标题】为啥使用 Xamarin Forms 的 iOS 应用程序不显示 Font Awesome?【英文标题】:Why doesn't Font Awesome display for iOS apps using Xamarin Forms?为什么使用 Xamarin Forms 的 iOS 应用程序不显示 Font Awesome? 【发布时间】:2020-12-11 09:29:09 【问题描述】:

我正在尝试在我的标签页标签中添加字体很棒的图标。我遵循了我认为能够为 Xamarin.forms 应用程序配置显示字体真棒图标的正确步骤,但由于某种原因,图标显示为 android 应用程序而不是 ios 应用程序。

我首先将字体 awesome .ttf 文件添加到 android Assets 文件夹和 iOS Resources 文件夹中:

接下来我更新了 iOS 的 Info.plist 文件,以便包含来自 Font Awesome 的 .ttf 文件:

然后我在 App.xaml 中配置了 Font Awesome 图标的使用:

最后我在他们的标签中添加了所需的图标:

【问题讨论】:

iOS 不使用字体系列的文件系统名称,它使用 postscript 系列名称(这些在文件中编码),这些名称可通过UIFont.FontNamesForFamilyName 获得,请查看代码我的答案的底部(***.com/a/48191854/4984832),你可以临时。将它添加到您的 Xamarin.iOS 项目并从控制台/调试输出中获取您的名称。或者使用 macOS 系统应用程序:“Font Book”,在这里查看我的答案:***.com/questions/45768488/… 阅读本指南:devblogs.microsoft.com/xamarin/embedded-fonts-xamarin-forms。您不需要将字体文件添加到平台项目中。然后删除应用数据并重试。 请不要将代码或错误作为图片发布 @Saftpresse99 我之前尝试过遵循这些确切步骤,但它会导致在 android 项目的 MainActivity cs 文件中引发错误: System.TypeLoadException: 'Could not resolve type with token' 【参考方案1】:

在 iOS 上,请使用“真实”字体名称而不是文件名。

您可以通过右键单击 Windows 上的 font file -> Properties -> Details -> Title 来检查。例如,我测试了一个文件名为Font Awesome 5 Free-Solid-900.otf 的自定义字体文件。如果将值设置为文件名则不起作用:

<OnPlatform x:TypeArguments="x:String" x:Key="FontAwesomeSolid">
    ...
    <On Platform="iOS" Value="Font Awesome 5 Free-Solid-900" />
</OnPlatform>

尝试获取自定义字体文件的倾斜度并删除“空格”。

指定如下值:

<OnPlatform x:TypeArguments="x:String" x:Key="FontAwesomeSolid">
    <On Platform="iOS" Value="FontAwesome5Free-Solid" />
</OnPlatform>

参考:Font Awesome not working in iOS

【讨论】:

【参考方案2】:

替换 App.xaml 中的 iOS 值。

<OnPlatform x:TypeArguments="x:String" 
                x:Key="FontAwesomeBrands">
                <On Platform="iOS"
                Value="FontAwesome5Brands-Regular" />
            </OnPlatform>

            <OnPlatform x:TypeArguments="x:String" 
                x:Key="FontAwesomeSolid">
                <On Platform="iOS" 
                Value="FontAwesome5Free-Solid" />
            </OnPlatform>

            <OnPlatform x:TypeArguments="x:String" 
                x:Key="FontAwesomeRegular">
                <On Platform="iOS" 
                Value="FontAwesome5Free-Regular" />
            </OnPlatform>

要获得在 iOS 中使用的正确字体名称,请在 AppDelegate 中 FinishedLaunching 中使用以下代码。

foreach (var family in UIFont.FamilyNames)
            
                System.Diagnostics.Debug.WriteLine($"family");
                foreach (var names in UIFont.FontNamesForFamilyName(family))
                
                    System.Diagnostics.Debug.WriteLine($"names");
                
            

【讨论】:

我试过了,但仍然没有看到显示字体真棒图标。此外,实现这个循环我无法输出名称。我正在通过 Visual Studio 2019 中的 macincloud 调试/运行 iOS 应用程序 @aqwright31 你能检查一下你的字体文件构建操作吗?是BundleResource吗?【参考方案3】:

在 App.xaml 中设置这些值适用于 Android 和 iOS。

        <OnPlatform x:Key="FontAwesomeBrands"
                    x:TypeArguments="x:String">
            <On Platform="iOS"
                Value="FontAwesome5Brands-Regular" />
            <On Platform="Android"
                Value="FontAwesome5BrandsRegular400.otf#" />
        </OnPlatform>

        <OnPlatform x:Key="FontAwesomeSolid"
                    x:TypeArguments="x:String">
            <On Platform="iOS"
                Value="FontAwesome5Free-Solid" />
            <On Platform="Android"
                Value="FontAwesome5FreeSolid900.otf#" />
        </OnPlatform>

        <OnPlatform x:Key="FontAwesomeRegular"
                    x:TypeArguments="x:String">
            <On Platform="iOS"
                Value="FontAwesome5Free-Regular" />
            <On Platform="Android"
                Value="FontAwesome5FreeRegular400.otf#" />
        </OnPlatform>

【讨论】:

【参考方案4】:

另一种方法是在主项目中将字体添加为Embedded Resource(抽象的字体,而不是*.iOS),并将以下内容添加到App.xaml.cs 的顶部(命名空间上方):

[assembly: ExportFont("fa-solid-900.ttf", Alias = "FASolid")]
[assembly: ExportFont("fa-regular-400.ttf", Alias = "FARegular")]
[assembly: ExportFont("fa-brands-400.ttf", Alias = "FABrands")]

这种方法适用于 Android 和 iOS。

【讨论】:

以上是关于为啥使用 Xamarin Forms 的 iOS 应用程序不显示 Font Awesome?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Xamarin Forms 对所有页面使用一个 Activity

为啥我的 Xamarin.Forms 控件在 StackLayout 中重叠?

Xamarin.Forms:为啥 IValueConverter 的过程不会永远打乒乓球?

为啥在使用 Prism 在 Xamarin.Forms 中导航到 root 时,我的 NavigationPage 顶部会出现默认标题?

为啥活动指示器在 Xamarin.forms 中不起作用?

在 iOS 上的 Xamarin.Forms.Maps 中使用 Xamarin.Essentials Geolocation 获取设备位置的奇怪问题