Eventually, I have managed to solve this issue.
I couldn't find a way to force the change the RTL - LTR auto layout constraints, so i have decided to duplicate 2 additional storyboards for each language direction.
So, actually my app now contains 3 storyboards - Main.storyboard, StoryboardRTL.storyboard and StoryboardLTR.storyboard.
Main handles changes in language direction when it is performed from the settings on the iDevice, and RTL / LTR is has it's own orientation, to support changing the app language from inside the app.
When the user selects to change to an RTL language, I set the selected language in the UserDefaults:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"he", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
and right after i call a method i have written in the AppDelegate, which changes the storyboard according to the language layout.
- (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];
}
This looks to the user as if the app restarted, and display the proper storyboard with the RTL / LTR layout.
When the user restarts the app again, the selected language is already set, and the main storyboard is displayed, with all the correct layout according to selected language.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…