【问题标题】:How to force "Respect Language Direction" from RTL to LTR and vice versa如何强制“尊重语言方向”从 RTL 到 LTR,反之亦然
【发布时间】:2014-08-19 07:51:21
【问题描述】:

我有一个使用自动布局的应用程序。

当用户选择他或她的设备电话语言时,应用程序可以完美地切换 RTL 和 LTR 语言。所有文本都已本地化,并且语言方向有效。

我在应用程序内还有一个按钮,可以在不重新启动应用程序的情况下更改其语言。 这也很好用,所有文本都被替换了。

问题在于,当用户从应用程序中更改语言时,具有讽刺意味的是,我预先定义的约束中的“尊重语言方向”选项没有得到尊重。

有什么想法吗?

【问题讨论】:

    标签: ios ios7 autolayout


    【解决方案1】:

    最终,我设法解决了这个问题。

    我找不到强制更改 RTL - LTR 自动布局约束的方法,因此我决定为每个语言方向复制 2 个额外的故事板。 所以,实际上我的应用现在包含 3 个故事板 - Main.storyboard、StoryboardRTL.storyboard 和 StoryboardLTR.storyboard。

    主要处理从iDevice上的设置执行时语言方向的变化,并且RTL / LTR有自己的方向,以支持从应用程序内部更改应用程序语言。

    当用户选择更改为 RTL 语言时,我在 UserDefaults 中设置选择的语言:

        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"he", nil] forKey:@"AppleLanguages"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    

    在我调用我在 AppDelegate 中编写的方法之后,它会根据语言布局更改情节提要。

    - (void)reloadStoryboard
    {
        UIStoryboard *storyboard;
    
        switch ([AALanguageManager getCurrentLanguage]) {
    
            case CurrentLanguageRTL:
                storyboard = [UIStoryboard storyboardWithName:@"StoryboardRTL" bundle:[NSBundle mainBundle]];
                break;
            default:
                storyboard = [UIStoryboard storyboardWithName:@"StoryboardLTR" bundle:[NSBundle mainBundle]];
                break;
        }
    
        self.window.rootViewController = [storyboard instantiateInitialViewController];
        [self.window makeKeyAndVisible];
    }
    

    这对用户来说就像应用重新启动一样,并显示具有 RTL / LTR 布局的正确情节提要。 当用户再次重新启动应用程序时,选择的语言已经设置好,主情节提要显示出来,所有的布局都根据选择的语言正确。

    【讨论】:

    • 这是一个糟糕的解决方案。如果您需要更改设计中的一件事,则必须更改 3 个不同的故事板
    • 这不是正确的解决方案,需要很多额外的工作,简单的解决方案是简单地将 UIView 的语义视图属性更改为 forceLeftToRIght 或 forceRightToLeft
    • @iosMentalist 这解决了一个问题,4 年后开箱即用。
    猜你喜欢
    • 2017-10-24
    • 2020-08-22
    • 2016-10-07
    • 2021-01-09
    • 2016-04-10
    • 2018-04-17
    • 1970-01-01
    • 2012-05-19
    • 2013-02-01
    相关资源
    最近更新 更多