如何强制“尊重语言方向”从RTL到LTR,反之亦然

时间:2014-08-19 07:51:21

标签: ios ios7 autolayout

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

当用户选择他或她的设备手机语言时,该应用程序可以完美地切换RTL和LTR语言。所有文本都已本地化,语言指示正常。

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

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

我找不到强制更改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布局显示正确的故事板。 当用户再次重新启动应用程序时,已设置所选语言,并显示主故事板,并根据所选语言显示所有正确的布局。