如何将大量图像导入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。