如何从 Xamarin Forms iOS 资产目录中删除“未知”图像

问题描述

更新 Xamarin Forms iOS 应用程序资产目录中的图像时,有时我会在图像集中显示额外的图像,有时正确的图像未分配给正确的 @1x、@2x 等。我也得到有时当我尝试将更改合并到我的项目版本之间时。我一直无法清除这些图像,并且当您右键单击资产目录中的这些图像时,没有取消分配的选项。即使通过 Visual Studio IDE 从资产目录中删除图像集似乎也无法正常工作,因为我开始遇到一些编译时错误,在 Assets.xcasttes 文件夹中找不到图像文件。任何想法如何正确合并/处理这种情况?我不想在我的项目的第二个版本(即分支)中手动重新更新图像。

解决方法

所以使用下面的步骤,我能够清理东西,但这是一个非常手动的过程。仍在寻找在分支之间合并 iOS 图像的好方法。以下步骤适用于 PC 上的 VS 2019。

仅供参考 - 如果您的项目受版本控制,我建议您在每次更改后进行检查。

  1. 进入包含“未知”图像的图像集并取消设置任何 实际设置的图像。 (您可以通过右键单击 图像并从弹出菜单中选择取消设置。)保存项目/ 完成此操作后的资产。
  2. 取消设置所有图像后,您只能看到图像集中的“未知”图像,请在左侧窗格中选择图像集名称,然后单击资产管理器窗口左上角附近的删除按钮。再次保存项目。
  3. 单击解决方案资源管理器中的 iOS 项目,然后选择解决方案资源管理器窗口顶部工具栏中的“显示所有文件”选项。您现在应该会在您的 iOS 项目下看到一个名为 Assets.xcassets 的文件夹。
  4. 展开 Assets.xcassets 文件夹并确保您没有看到您删除的图像集的文件夹。例如,如果您删除名为“help”的图像集,请确保在 Assets.xcassets 文件夹下看不到名为 help.imageset 的文件夹。如果您确实看到了刚删除的图像集的文件夹,则可能需要手动进入文件资源管理器并从磁盘驱动器中删除该文件夹。
  5. 一旦图像集的文件夹不再存在于 Assets.xcassets 文件夹中,我强烈建议您清理整个项目。
  6. 接下来右键单击 iOS 项目并从弹出菜单中选择“卸载项目”。
  7. 卸载项目后,XXX.iOS.csproj 文件(其中 XXX 是项目名称)应该会在 Visual Studio 编辑器中自动打开。您现在需要在此 csproj 文件中搜索您删除的图像集名称的所有实例,并删除您找到的所有 XML 条目。例如,如果我删除了 'config' 图像集并在我的 csproj 文件中找到了以下条目,我将删除所有 XML 条目。 注意:我无法在此处实际显示 XML,因此我将其放在单独的答案中,以便每个人都能看到。

重要!! - 另外 - 确保在 Assets.xcassets 下的文件夹中确保没有 Images.imageset 文件夹,除非您实际使用名为 Images 的资产图像集。否则删除此文件夹并确保 iOS.csproj 文件中未引用该文件夹/文件。

  1. 从不再属于资产目录的图像中删除所有条目后,保存 iOS csproj。然后右键单击解决方案中的 iOS 项目并选择“重新加载项目”。

  2. 您现在应该能够重新编译项目而不会出错。记住 - 经常将您的项目签入您的版本控制系统,尤其是此时。

  3. 现在您可以返回资产目录并重新添加所需的图像集。

在此之后一切都应该正常工作。

,

因此,出于某种原因,我无法将上面发布的 XML 代码实际显示出来,因此我将尝试将其发布到此处。

<ImageAsset Include="Assets.xcassets\config.imageset\config.png">
  <Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\config.imageset\config@2x.png">
  <Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\config.imageset\config@3x.png">
  <Visible>false</Visible>
</ImageAsset>
<ImageAsset Include="Assets.xcassets\config.imageset\Contents.json">
  <Visible>false</Visible>
</ImageAsset>

<ItemGroup>
  <ImageAsset Include="Assets.xcassets\Images.imageset\qrbuttonlight32.png">
    <Visible>false</Visible>
  </ImageAsset>
</ItemGroup>
<ItemGroup>
  <ImageAsset Include="Assets.xcassets\Images.imageset\qrbuttonlight64.png">
   <Visible>false</Visible>
  </ImageAsset>
</ItemGroup>
<ItemGroup>
  <ImageAsset Include="Assets.xcassets\Images.imageset\qrbuttonlight96.png">
   <Visible>false</Visible>
  </ImageAsset>
</ItemGroup>

您需要确保删除完整的 XML 标记 - 在这种情况下,它将是配置图像集中每个文件的整个 ImageAsset XML 节点。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...