RTL 语言的可靠 iOS 图像翻转
Reliable iOS image flipping for RTL languages
我正在尝试使图像翻转可靠地工作,但我发现了一些问题。我在 Xcode 资产目录中管理我的图像,需要以 RTL 语言翻转的图像已配置为 'Direction' 属性 设置为 'Left to right, Mirrors'。
在某些情况下,我有 2 个独立的资产,因为翻转是不够的。这些配置为 'Direction' 属性 设置为 'Both' 并提供两个单独的图像资产。
所有图像都是启用了 'Preserve vector data' 的 PDF 资产。
只要我使用 iOS 11 和 Xcode 9.2 进行测试,这一切都很好用。
当我在 iOS 9 上测试时,问题就开始了。当我启动应用程序时,为 RTL 配置的图像不会显示,即使我不是 运行 使用 RTL 语言也是如此。
从Xcode9.3开始,我好像遇到了新问题。资产目录会自动更新; RTL 图像被重新配置为 'Both' 方向,并对目录中的 json 文件进行了更改。选择 'Left to right, Mirrors' 不再有效。
有没有人知道如何让它可靠地工作?或者我只是在查看 Xcode 中的最新错误和 iOS9 中的一些旧问题?
[编辑]
在进一步分析生成的 IPA 文件后,似乎 Assets.car 文件不包含 RTL 图像的 .png 文件。似乎它们没有生成(因为源文件是 PDF),所以这可以解释 iOS 9(不使用 PDF 图像)中丢失的图像。
我修复了它,但 Apple 开发者论坛上有人指出资产目录 'direction' 属性 直到 Xcode 8 / [=27= 才被引入] 10.
这意味着它在 iOS 9 中不起作用,这可能是一个 Xcode 错误,您甚至可以 select 当部署目标设置在 iOS10.
因此,如果您想与旧的 iOS 设备兼容,请不要尝试使用此功能!您仍然可以让它以编程方式工作。
如果您在 UIBarButtonItem 中有一个图像,您可以为这个按钮创建一个出口,运行 viewDidLoad 中的以下内容:
self.someButton.image = [self.someButton.image imageFlippedForRightToLeftLayoutDirection];
之所以有效,是因为 imageFlippedForRightToLeftLayoutDirection 受 iOS 9 支持。它仅在您的应用处于 RTL 模式时翻转图像。
如果您需要加载完全不同的图像,您可以按如下方式进行:
if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) {
self.someButton.image = [UIImage imageNamed:@"someRTLImage"];
}
我正在尝试使图像翻转可靠地工作,但我发现了一些问题。我在 Xcode 资产目录中管理我的图像,需要以 RTL 语言翻转的图像已配置为 'Direction' 属性 设置为 'Left to right, Mirrors'。 在某些情况下,我有 2 个独立的资产,因为翻转是不够的。这些配置为 'Direction' 属性 设置为 'Both' 并提供两个单独的图像资产。 所有图像都是启用了 'Preserve vector data' 的 PDF 资产。
只要我使用 iOS 11 和 Xcode 9.2 进行测试,这一切都很好用。 当我在 iOS 9 上测试时,问题就开始了。当我启动应用程序时,为 RTL 配置的图像不会显示,即使我不是 运行 使用 RTL 语言也是如此。
从Xcode9.3开始,我好像遇到了新问题。资产目录会自动更新; RTL 图像被重新配置为 'Both' 方向,并对目录中的 json 文件进行了更改。选择 'Left to right, Mirrors' 不再有效。
有没有人知道如何让它可靠地工作?或者我只是在查看 Xcode 中的最新错误和 iOS9 中的一些旧问题?
[编辑] 在进一步分析生成的 IPA 文件后,似乎 Assets.car 文件不包含 RTL 图像的 .png 文件。似乎它们没有生成(因为源文件是 PDF),所以这可以解释 iOS 9(不使用 PDF 图像)中丢失的图像。
我修复了它,但 Apple 开发者论坛上有人指出资产目录 'direction' 属性 直到 Xcode 8 / [=27= 才被引入] 10.
这意味着它在 iOS 9 中不起作用,这可能是一个 Xcode 错误,您甚至可以 select 当部署目标设置在 iOS10.
因此,如果您想与旧的 iOS 设备兼容,请不要尝试使用此功能!您仍然可以让它以编程方式工作。
如果您在 UIBarButtonItem 中有一个图像,您可以为这个按钮创建一个出口,运行 viewDidLoad 中的以下内容:
self.someButton.image = [self.someButton.image imageFlippedForRightToLeftLayoutDirection];
之所以有效,是因为 imageFlippedForRightToLeftLayoutDirection 受 iOS 9 支持。它仅在您的应用处于 RTL 模式时翻转图像。
如果您需要加载完全不同的图像,您可以按如下方式进行:
if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) {
self.someButton.image = [UIImage imageNamed:@"someRTLImage"];
}