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.