从右到左语言中基于百分比的自动布局布局

Autolayout Percentage-based Placement in Right-to-left Language

我在将子视图放置在我的视图中时遇到问题,该子视图与后缘的距离为百分比。它在常规的从左到右的语言(例如英语)中工作正常,但是当我本地化为从右到左的语言(例如阿拉伯语或希伯来语)时,约束似乎归零并直接对接后缘(在这种情况下为左侧)。我创建了一个最小的测试项目,并且能够在那里重现该问题。

我所有的视图都是在 xib 文件中设置的,而不是在故事板中。

我用 xib 创建了一个 ViewController。然后我放入一个固定大小的 50x50 子视图并将其放置在距离顶部固定 100 的位置,然后将后缘 80% 放置到超级视图的尾部,如屏幕截图所示:

为了更好地衡量并确保翻转视图,我添加了一个完全独立于其他子视图的标签。当我用英文 运行 这个时,一切看起来都很棒:

然而,将设备的语言更改为阿拉伯语后,标签正确镜像,但似乎忘记了尾随约束的百分比,只看到常量 0,这导致子视图直接放置在视图。

有谁知道我需要如何修改我的约束才能让设备记住 RTL 语言中基于百分比的对后缘的约束?

发现问题 - 结果发现问题是当自动布局约束翻转方向时,坐标系不是。这意味着标准 LTR 约束将后缘放置在右边缘坐标值(等于视图的宽度)的 80% 处。但是,当为 RTL 语言翻转视图约束时,它现在是左边缘坐标值的 80%,现在为 0。

不幸的是,似乎没有一个简单的解决方案。我尝试将视图放置在相对于视图中心的百分比位置。同样,它在 LTR 中工作正常,但当切换到 RTL 时,它在视图右侧保持完全相同的位置(因此它不能正确镜像)。 TBH,我不确定 任何 基于百分比的约束在非居中的 LTR 和 RTL 中如何工作。

目前的解决方案是根据适当的范例在运行时设置约束。所以在 LTR 中我将它设置在中心坐标的 150% 左右,但如果它是 RTL 我设置大约 50%。

如果您的目标是 iOS 9 或更高版本,则可以使用布局指南 (UILayoutGuide) 来设置间距。基本上,让视图的后缘紧靠布局指南的前缘,布局指南的后缘紧靠超级视图的后缘,布局指南的宽度等于超级视图宽度的 20%。

在 iOS9 之前,您可以使用隐藏的虚拟视图而不是布局指南。