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

Raz*_*Raz 6 ios autolayout ios7

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

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

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

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

有任何想法吗?

Raz*_*Raz 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];
Run Code Online (Sandbox Code Playgroud)

然后我调用我在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];
}
Run Code Online (Sandbox Code Playgroud)

这会向用户显示应用程序重新启动,并使用RTL/LTR布局显示正确的故事板.当用户再次重新启动应用程序时,已设置所选语言,并显示主故事板,并根据所选语言显示所有正确的布局.