如何在 iOS 中将所有 UIView 从左移到右? (Objective-C)

How to shift all UIView From Left to Right in iOS? (Objective-C)

我正在开发支持英语和阿拉伯语的应用程序。

我的要求是当我选择英文的时候,所有的UIView都应该从左到右显示。
(即在UIImageView右边左侧有一个UIImageViewUILabel,见下图)

但是当用户选择阿拉伯语时,UIImageView 应该出现在屏幕的右侧,UILabel 应该出现在 UIImageView 的左侧。

是否可以在 iOS 中完成,或者我应该为阿拉伯语创建单独的 ViewController 布局????

这里我需要更改布局

已经为您做好了。使用 Autolayout 创建您 UI (NSLayoutConstraint)。创建水平视图层次结构时使用 NSLayoutAttributeLeadingNSLayoutAttributeTrailing 属性。第一个将对应于英语设备区域设置的左边缘和阿拉伯语的右边缘。反之亦然

查看本教程了解更多信息https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingYourUserInterface/InternationalizingYourUserInterface.html

有两种本地化方式,

  • Localisation- 你可以使用单个故事板来完成,你只需要设置前导 space 和尾随 space 约束小心,当您更改语言时,OS 将负责制作英文版视图的镜像(特别是对于 RTL 语言)。这是如何工作的,当您从设备设置更改语言然后启动应用程序时,iOS 检查所选语言然后加载该特定语言的故事板,但在您的情况下您必须提供应用程序本身的语言更改功能,那么您必须编写一些额外的代码来即时更改语言。

  • 创建单独的故事板- 第二个是为每种语言创建单独的故事板,并首先为英语设计屏幕,然后复制并粘贴相同的阿拉伯语语言故事板和只是移动组件以制作相同的镜像。

注:

在这两种方式中,您都允许用户在应用程序本身中更改应用程序语言,因此您必须付出一些额外的努力,因为本地化的默认行为是您需要重新启动应用程序才能看到效果并且当您更改设备语言时应用程序语言也会更改,您不能简单地即时更改语言并看到正在发生的 UI 更改,这不会发生。

因此,您必须在编码部分做些什么才能更改应用程序中的语言,用户应该能够看到所选语言的 UI,如下所述,

哪种方法更好?

如果应用程序具有简单 UI 并且范围较小,那么您可以进行本地化,即针对多种语言的单个故事板。

但是如果应用程序很复杂 UI 并且应用程序的范围也相当大,那么我建议您使用单独的故事板,因为使用本地化有一些限制,或者我们可以说这很棘手为复杂的 UI 设置约束,如果您卡在 UI 部分,则可能需要更多时间,使用单独的情节提要则不会出现这种情况,因为您可以根据需要轻松进行更改.

现在让我们看一些代码,

下面是切换两个故事板的代码,

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

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

    [sender setSelected:NO];

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

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

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

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

    [[NSUserDefaults standardUserDefaults] synchronize];

} else { //Load English Storyboard

    [sender setSelected:YES];

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

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

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

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

    [[NSUserDefaults standardUserDefaults] synchronize];
}

这是在本地化(并更改应用程序本身的语言)的情况下重新实例化故事板的代码,

//Change language to English
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    [delegate setCountryLanguageCode:@"US" AndLanguageCode:@"en"];

//Change language to Arabic
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    [delegate setCountryLanguageCode:@"EG" AndLanguageCode:@"ar"];

//Re-instantiate the storyboard
-(void)setCountryLanguageCode:(NSString *)countryCode AndLanguageCode:(NSString *)languageCode{
    [NSBundle setLanguage:languageCode];
    UIStoryboard *storyRef = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    self.window.rootViewController = [storyRef instantiateInitialViewController];
}

注:

Apple 不推荐提供应用内语言更改功能,因为这可能会导致设备选择的语言与应用程序语言之间的混淆,但如果这是您的要求并且无论如何您都必须这样做,那么选择权在您.

希望对你有帮助。

最好的方法是使用 NSLayoutConstraint 来管理它。请参考以下伪代码:

- (void)createConstraints {
/* Constraint creation methods. See comments in each method for more detail. */

[self createCompactConstraints];

[self createRegularConstraints];

/* Activate a set of constraints for initial layout. */
[NSLayoutConstraint activateConstraints: rightSideConstraint];
[NSLayoutConstraint activateConstraints: leftSideConstraint];}

- (void)createLeftConstraints {
/*
 Use NSLayoutConstriant class to implement the layout for the required label.
 */}

- (void)createRightConstraints {
/*
 Use NSLayoutConstriant class to implement the layout for the required label.
 */}



- (void)changeLayout{

if(!Arabic){
    /*
     Deactivate left to right label constraint
     Activate right to left label constraint
     */
}
else{
    /*
     Deactivate right to left label constraint
     Activate left to right label constraint
     */
} }