Ios 应用程序中的自动布局RTL支持

Ios 应用程序中的自动布局RTL支持,ios,autolayout,right-to-left,nslocalizedstring,nslocale,Ios,Autolayout,Right To Left,Nslocalizedstring,Nslocale,我知道iOS支持RTL(从右到左)语言,通过使用前导和尾随约束I“tell”autolayout根据语言方向堆叠元素。 这一切都很好。如果我想修正约束,我会关闭尊重语言方向,这样就没有问题了。但是,我需要进行应用程序内语言选择,这将有LTR和RTL语言。如何向应用发送信号,将视图镜像到RTL,反之亦然? 我知道如果我遍历约束并将前导/尾随更改为左-右,反之亦然,这是可以做到的,但是有更简单的解决方案吗? 如果需要,应用程序重启也可以! 解决方案应支持iOS 8.x+ 谢谢无需重新启动应用程序,无

我知道iOS支持RTL(从右到左)语言,通过使用
前导和尾随约束
I“tell”
autolayout
根据语言方向堆叠元素。 这一切都很好。如果我想修正
约束
,我会关闭尊重语言方向,这样就没有问题了。但是,我需要进行应用程序内语言选择,这将有LTR和RTL语言。如何向应用发送信号,将视图镜像到RTL,反之亦然? 我知道如果我遍历约束并将前导/尾随更改为左-右,反之亦然,这是可以做到的,但是有更简单的解决方案吗? 如果需要,应用程序重启也可以! 解决方案应支持iOS 8.x+
谢谢

无需重新启动应用程序,无需其他解决方案

苹果指南建议开发者不要在应用程序内部实现语言选择。开发人员应使用设备选择的语言

如果您正在询问重新启动应用程序的方法。这也是不可能的。您可以向用户显示警报,要求他/她重新启动。关闭ViewController也不能解决问题

如果我想实现应用内语言选择,我通常不会为我的应用打开本地化。不幸的是,我通过编码来实现所有约束


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

hasan83答案非常有用,但我想与大家分享我在支持从右到左和从左到右语言方面所做的工作

正如hasan83在回答中正确指出的那样,“需要重新启动应用程序”才能从右向左更改UI,反之亦然

因此,如果您必须不惜任何代价提供应用程序内语言选择,有一种方法

你必须为你的应用程序添加两个故事板,一个是英语,另一个是阿拉伯语(在我的例子中)。首先为英语设计屏幕,然后复制并粘贴阿拉伯语屏幕,并改变屏幕位置,以形成英语屏幕的镜像。这就是设计视角

使用以下选项编辑您的DidFinishLaunching

- (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,否则,如果允许用户在应用程序流之间的任何位置更改语言,则效果将不理想

我正在考虑在某种“根”视图控制器上重新加载容器内的情节提要视图,这将导致重新绘制整个应用程序。但我仍然不知道如何强制定向,我可以在iOS9.x中进行定向,但我看不到任何其他选项,然后在重新绘制控制器时,在视图出现之前将前导更改为左,并将尾随更改为右。是的,最后必须进行编码。根据语言的不同,通过代码将前导和尾随分别更改为左右看起来不错。+1是hasan83对应用程序内语言切换程序的看法。如果你的应用程序没有始终自动遵循系统语言,这将是一个非常混乱的用户体验。不建议在运行时覆盖语言NSUserDefaults,并且对于你的应用程序显示的系统UI仍然不起作用,或应用程序使用的格式化程序。请解释一下“不建议在运行时覆盖语言默认值”的含义。我已经解释了允许用户更改应用程序内部语言的方法,它与系统/操作系统语言无关。我目前正在开发一个应用程序,我在其中处理了应用程序内语言更改(因为我的客户希望给他的用户提供应用程序内语言更改选项),到目前为止,我在任何方面都没有遇到任何挑战(系统UI…)(80%的应用程序已完成)。如果你认为这不是推荐的/错误的方式,我想在这里向你介绍更多。我的观点是,不推荐在应用程序内部更改语言。这会让用户感到困惑,因为他们希望应用程序始终遵循系统语言。在应用程序内部的LTR和RTL语言之间切换时,您将遇到问题和意外错误,并且日期格式化程序以及任何系统UI(如UIActivityViewController)将不尊重您设置的语言。请不要这样做。你的观点是正确的,但现在很多应用程序都提供了这种功能(特别是为中东人开发的应用程序)。我没有使用任何类型的本地化,我所做的是管理所有视图,使其看起来像所选的语言。与英文故事板中的标签一样,左对齐,而同一标签在阿拉伯语中将有正确的对齐,这是完全好的,我只是有两个故事板两种语言。我的观点仍然是,你为中东的用户提供了一个低于标准的用户体验。要为您安装的每个应用程序管理一种语言是令人困惑的。