如何将大量图像导入Xamarin.iOS项目

我正在开发Xamarin.iOS的iOS应用程序,对我来说,第一个具有挑战性的事情是如何在Xamarin.iOS项目中添加大量图像。 我正在做一个小项目,可以转换货币汇率,并且需要显示很多货币标记。 当我想将图像添加到Xamarin.iOS项目中时,我发现它是如此无聊,Visual Studio无法为我们提供添加图像的便捷方法。

我不想一一添加。 让我们看看将图像添加到项目中时发生了什么。 然后我们可以找到一些使其自动化的方法。

在开始之前,建议您阅读此文档:在Xamarin.iOS中显示图像。 因此,您可以对该主题有基本的了解。

通过编辑器添加图像

首先,让我们按照官方说明添加图片。 右键单击Asset Catalogs然后选择Add Asset Catalog

输入Tests作为资产目录名称:

Asset Catalogs文件夹中双击Tests ,然后您将看到Tests.xcassets的结构:

要添加图片,请点击顶部的第一个按钮,然后选择Add Image Set

编辑器将添加一个名为Images的图像集,如下所示:

现在,您可以选择不同大小的图像以适合不同的分辨率和设备。 您也可以将图像直接拖到编辑器中。

例如,我为1x选择一个小的图像文件。 我不选择其他人,因为这只是一个演示。

实际上,此图像的文件名是flag_white.png (取决于您的选择)。 但是在Tests.xcassets设置的图像名称是Images 。 您可以通过选择图像集重命名并在“ Properties窗口中更新“ Name属性:

让我们将其重命名为MyFirstImage

现在,您可以通过以下代码在代码中使用图像文件:

  MyFirstImage.Image = UIImage.FromBundle(“ MyFirstImage”); 

添加图像后发生了什么

Xamarin.iOS使用不同于UWP和Android的方式来组织资源。 Xamarin.iOS不用使用文件名,而是使用Asset Catalogs Images Sets指定一个Json文件来指示文件名。 这意味着您的文件名称可能与代码中的名称不同。

好。 接下来,让我们找出添加图像后发生的情况。 右键单击Xamarin.iOS项目,然后Open folder in File explorer选择“ Open folder in File explorer 。 您会看到一个名为Tests.xcassets的新文件夹。 打开它,您将找到一个名为myfirstimage.imageset的文件夹。 打开此文件夹,您将找到两个文件,一个是原始图像文件,另一个是Content.json文件。

打开此json文件,内容如下所示:

  { 
“图片”: [
{
“ scale”:“ 2x”,
“成语”:“通用”
},
{
“ scale”:“ 3x”,
“成语”:“通用”
},
{
“ scale”:“ 1x”,
“成语”:“通用”,
“ filename”:“ myfirstimage.png”
}
],
“属性”:{},
“信息”:{
“版本”:1,
“作者”:“”
}
}

这就对了。 但是Xamarin.iOS必须做一些其他事情才能将其包含到项目中。 现在,右键单击Xamarin.iOS项目,然后选择Unload Project 。 然后右键单击该项目,然后选择Edit ***.csproj 。 现在,您可以直接对其进行编辑。

您会发现有一些名为ImageAsset部分,如下所示:

   
false


false

现在我们知道添加图像后Xamarin.iOS会做什么。 它只是将图像导入特定的文件夹,并添加一个json文件以指定图像的名称,然后在* .csproj文件中添加xml部分以包括它们。

制作使流程自动化的工具

想象一下,我们可能有很多图像将被添加到项目中。 一一添加并手动更新名称? 那肯定是一项巨大的工作! 我听说优秀开发人员的最大特点之一就是懒惰。 我们一定不能这样做。 所以我写了一个工具来简化工作。

首先,假设我们在文件夹中有一些图像。 为了简单起见,我们不需要不同大小的图像。 我们将它们导入Xamarin.iOS项目。 我现在应该做的是获取文件列表并将其循环,生成Content.json文件并将其复制到特定文件夹中,然后生成* .csproj的xml段。

我创建了一个简单的控制台应用程序来自动生成这些文件。 首先,获取图像文件夹,然后获取该文件夹中的图像。 循环处理这些图像:

 私有静态void GenerateResources(字符串assetCatalogName,DirectoryInfo currentDirectory,List 图像) 
{
var targetDirectory = currentDirectory.CreateSubdirectory($“ {assetCatalogName} .xcassets”);
StringBuilder sb = new StringBuilder();
foreach(images.AsParallel()中的var fileInfo)
{
var imageFolder =
targetDirectory.CreateSubdirectory($“ {fileInfo.Name.Replace(fileInfo.Extension,”“)}。imageset”);
fileInfo.CopyTo(Path.Combine(imageFolder.FullName,fileInfo.Name));
var jsonFile = new FileInfo(“ Contents.json”);
字符串内容= File.ReadAllText(“ Contents.json”);
File.WriteAllText(Path.Combine(imageFolder.FullName,“ Contents.json”),
content.Replace(“ {filename}”,fileInfo.Name));
sb.Append(
$ @“ ”));
sb.Append(Environment.NewLine);
sb.Append(@“ false ”);
sb.Append(Environment.NewLine);
sb.Append(@“ ”);
sb.Append(Environment.NewLine);
sb.Append(
$ @“ ”));
sb.Append(Environment.NewLine);
sb.Append(@“ false ”);
sb.Append(Environment.NewLine);
sb.Append(@“ ”);
sb.Append(Environment.NewLine);
}

File.WriteAllText(Path.Combine(targetDirectory.FullName,“ csproject.txt”),sb.ToString());
}

Main类中调用以下方法:

 静态void Main(string [] args) 
{
Console.WriteLine(“ Hello World!欢迎使用ImagesImporter4iOS。请输入图像文件夹路径:”);
var path = Console.ReadLine();
var currentDirectory = GetDirectory(path);
var images = GetImages(currentDirectory);

Console.WriteLine(“请输入资产目录名称:”);
var assetCatalogName = Console.ReadLine();

GenerateResources(assetCatalogName,currentDirectory,images);
Console.WriteLine($“已完成!请复制{assetCatalogName} .xcassets文件夹到您的iOS项目的根文件夹中,并将csproject.txt的内容复制到您的* .csproj文件中。”);
Console.WriteLine(“按Enter退出。”);
var enter = Console.ReadKey();
如果(enter.Key == ConsoleKey.Enter)
{
Environment.Exit(0);
}
}

完成了 运行此控制台应用程序,然后输入文件夹路径和资产目录名称:

您会看到所有文件夹都是在目标文件夹中自动生成的:

将* .xcassets文件夹复制到Xamarin.iOS项目的根文件夹中。 打开csproject.txt文件,然后复制内容并将其粘贴到* .csproj文件中。 首先将其卸载以进行编辑。

例如,如果还有其他要求,例如设置不同大小的图像,则可以轻松地编辑脚本来执行此操作。

请在此处找到源代码:ImagesImporter4XamariniOS。