应用程序中的Autolayout RTL支持

时间:2016-03-14 17:52:50

标签: ios autolayout right-to-left nslocalizedstring nslocale

我知道iOS有RTL(从右到左)支持语言,而且使用leading and trailing constraints I"告诉" autolayout根据语言方向堆叠元素。 一切都很好。如果我想要修复constraint,我会关闭语言方向并且没有问题。但是我需要在应用程序语言选择中进行选择,它将具有LTR和RTL语言。如何通知应用程序将视图镜像到RTL,反之亦然? 我知道如果我遍历约束并将前导/尾随更改为左右反之亦然可以做到这一点,但有没有更简单的解决方案呢? 如果需要,应用程序重启也很好! 解决方案应该支持iOS 8.x + 谢谢

2 个答案:

答案 0 :(得分:2)

无需其他解决方案即可重新启动应用。

Apple guidlines建议开发人员不要在应用内部实现语言选择。开发人员应使用设备选择的语言。

如果您要求重启应用的方法。这也是不可能的。您可以向用户显示警告,要求他/她重新启动。关闭viewcontrollers也不会解决问题。

如果我想实现应用内语言选择,我通常不会为我的应用启用本地化。不幸的是,我通过编码做了所有限制。

您还可以有两个布局,一个用于RTL,另一个用于LTR。但是,您还需要停止本地化,前导和尾随约束将会影响您的布局。或者您需要手动将它们全部转换为左侧。关闭内部本地化可以使任何附加约束具有左右属性而不是尾随和前导。

答案 1 :(得分:-1)

hasan83回答非常有帮助我还想分享我为支持从右到左和从左到右语言所做的工作。

正如hasan83正确地指出了“需要重新启动应用程序”才能更改UI从右到左和从左到右反之亦然。

因此,如果您必须不惜任何代价提供应用语言选择,那么就有办法,

您必须为您的应用添加两个故事板,一个用于英语,另一个用于阿拉伯语(在我的情况下)。首先设计英文屏幕,然后用阿拉伯语复制粘贴,并改变屏幕位置,使英文屏幕镜像。这就是设计观点。

编辑你的didFinishLaunchingWithOptions,如下所示,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//Load storyboard for the selected language
if ([kGetSelectedLanguage isEqualToString:kEnglish]) { //Load English Storyboard

    // Get English Language Storyboard
    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"English" bundle:nil];

    // Create Navigation controller with RootViewController
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[storyBoard instantiateViewControllerWithIdentifier:@"FindRestaurantsViewController"]];

    // Set Windows RootViewController
    [self.window setRootViewController: navigationController];

} else { //Load Arabic Storyboard

    // Get Arabic Language Storyboard
    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Arabic" bundle:nil];

    // Create Navigation controller with RootViewController
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[storyBoard instantiateViewControllerWithIdentifier:@"FindRestaurantsViewController"]];

    // Set Windows RootViewController
    [self.window setRootViewController: navigationController];

}
}

将以下代码添加到用户更改应用语言的按钮操作

if ([kGetSelectedLanguage isEqualToString:kEnglish]) { //Load Arabic Storyboard

    // Get Arabic Language Storyboard
    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Arabic" bundle:nil];

    // Create Navigation controller with RootViewController
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[storyBoard instantiateViewControllerWithIdentifier:@"YourRootViewControllerIdentifier"]];

    // Set Windows RootViewController
    [appDelegate.window setRootViewController: navigationController];

    [[NSUserDefaults standardUserDefaults] setObject:kArabic forKey:kSelectedLanguage];

    [[NSUserDefaults standardUserDefaults] setObject: @"2" forKey:kSelectedLanguageId];

    [[NSUserDefaults standardUserDefaults] synchronize];

} else { //Load English Storyboard

    // Get English Language Storyboard
    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"English" bundle:nil];

    // Create Navigation controller with RootViewController
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[storyBoard instantiateViewControllerWithIdentifier:@"YourRootViewControllerIdentifier"]];

    // Set Windows RootViewController
    [appDelegate.window setRootViewController: navigationController];

    [[NSUserDefaults standardUserDefaults] setObject:kEnglish forKey:kSelectedLanguage];

    [[NSUserDefaults standardUserDefaults] setObject: @"1" forKey:kSelectedLanguageId];

    [[NSUserDefaults standardUserDefaults] synchronize];
}

确保将语言更改按钮添加到RootViewController,否则如果允许用户在应用程序流之间的任何位置更改语言,则效果不佳。