ios 7 - 强制视图布局翻转到 RTL 而无需更改语言

Posted

技术标签:

【中文标题】ios 7 - 强制视图布局翻转到 RTL 而无需更改语言【英文标题】:ios 7 - Force view layout flip to RTL without language change 【发布时间】:2014-12-29 08:42:23 【问题描述】:

我的应用中有一些视图需要能够同时显示 LTR 和 RTL 内容(但不能同时显示),并且它必须与一般的应用布局方向无关。意思是,我希望能够告诉特定视图将其布局从 LTR 翻转到 RTL,反之亦然,无需更改系统语言。 我对此进行了相当多的研究,但除了以下两种解决方案之外,似乎不可能:Flip layout on iPhone for RTL languages How to force "Respect Language Direction" from RTL to LTR and vice versa 第一个解决方案与我的情况无关。第二种解决方案让我想到了为每个视图保留两个版本,一个用于 RTL,一个用于 LTR,并即时使用相关的版本。这意味着我将不得不在每次 UI 更新时更新两次视图。 当然,第三种解决方案是在显示视图之前以编程方式根据相关方向手动更改视图的布局。 那么,这些是我唯一的选择吗? P.S:我只在谈论布局,而不是本地化字符串,因为我自己处理正确的文本。

【问题讨论】:

在实现这一点上有什么运气吗? @user2695433 查看我的答案。 【参考方案1】:

我发现它很容易实现,只是:

func setRTL(_ sender: UIButton) 
    UIView.appearance().semanticContentAttribute = .forceRightToLeft
    UINavigationBar.appearance().semanticContentAttribute = .forceRightToLeft
    if let vc = storyboard?.instantiateViewController(withIdentifier: "root") 
        UIApplication.shared.keyWindow?.rootViewController = vc
    

预览:

查看完整的DEMO。

【讨论】:

【参考方案2】:

ios 9 开始,您现在可以使用 UIViewsemanticContentAttribute 属性在每次查看的基础上执行此操作。如果您正在使用自动布局,或者您的控件是/继承自 UIKit,那么只要设置了此属性,它们就应该做正确的事情。

请注意,对于标签、文本字段和视图,您可能还需要根据所显示的文本更改文本对齐方式。

【讨论】:

以上是关于ios 7 - 强制视图布局翻转到 RTL 而无需更改语言的主要内容,如果未能解决你的问题,请参考以下文章

将 Native App LTR 反应到 RTL 更改,而无需重新启动应用程序

Android Debug Bridge 强制 RTL 选项在没有 root 的情况下应用

在不翻转标签的情况下翻转视图

iOS 7 模态视图转换和背景/壁纸

iOS9之UIStackView体验,无需任何约束,这才是真正的自动布局,快到不能呼吸

即时更改 UI - iOS