我有一个使用自动布局的应用程序。
当用户选择他或她的设备电话语言时,应用程序完美地切换RTL和LTR语言。所有的文本都是本地化的,语言方向是有效的。
我也有一个按钮内的应用程序,改变它的语言,而无需重新启动应用程序。这也很有效,所有的文本都被替换了。
问题是,当用户从应用程序内更改语言时,"尊重语言方向"选项在我预定义的约束中是不受尊重的。
任何想法?
最终,我设法解决了这个问题。
我找不到一种方法来强制改变RTL - LTR自动布局约束,所以我决定为每个语言方向复制2个额外的故事板。实际上,我的app现在包含3个storyboard - Main。故事板,StoryboardRTL。故事板和故事板dltr .storyboard.
Main处理从iDevice上的设置执行时语言方向的更改,RTL/LTR is有自己的方向,以支持从应用程序内部更改应用程序语言。
当用户选择更改为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布局。当用户重新启动应用程序时,所选语言已经设置好,并显示主故事板,并根据所选语言进行正确的布局。