如何将iOS中的所有UIView从左移到右? (目标C)
我正在开发支持英语和阿拉伯语的应用程序。
我的要求是当我select英文时,所有的UIView
应该从左到右显示。
(即在左边UIImageView
右边有一个UIImageView
和UILabel
,见下图)
但是,当用户select阿拉伯语言,那么UIImageView
应该来到屏幕的右侧, UILabel
应该来到UIImageView
的左侧。
是否有可能在iOS或我应该创build阿拉伯语言的separte ViewController
布局?
在这里我需要改变我的布局
本地化有两种方式,
-
本地化 – 您可以使用单个故事板来做到这一点,您只需仔细设置前导空间和尾部空间约束,并且在更改语言时,操作系统将负责制作视图英文版的镜像(特别是对于RTL语言) 。 这是如何工作的,当你从设备设置改变语言,然后当你启动应用程序,iOS检查所选语言,然后加载该特定语言的故事板,但在你的情况下,你必须提供语言更改function在应用程序本身,那么你必须编写一些额外的代码来改变飞行中的语言。
-
创build单独的故事板 – 第二个是为每种语言创build单独的故事板,并首先devise英语语言屏幕,然后将其复制并粘贴在阿拉伯语故事板中,然后将组件转换为镜像。
注意:
在这两种方式中,您都提供用户在应用程序本身中更改应用程序语言,因此您必须采取一些额外的工作,因为本地化事件的默认行为是您需要重新启动应用程序以查看效果,并且应用程序语言将当你改变设备语言时,改变你不能简单的改变语言,看到UI的变化发生,这不会发生。
所以你在编码方面做了什么来改变应用程序中的语言,用户应该能够看到所select语言的UI在下面解释,
哪个更好?
如果应用程序具有简单的用户界面,也有很小的范围,那么你可以去为多语言单故事板的本地化。
但如果应用程序有复杂的用户界面和应用程序的范围也相当大,那么我build议你去单独的故事板,因为使用本地化有一定的局限性,或者我们可以说为复杂的用户界面设置约束是非常棘手的,如果你被卡在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]; }
注意:
提供应用程序语言更改function不被Apple推荐,因为它可能会导致设备select语言和应用程序语言之间的混淆,但如果这是您的要求,并且您必须这样做,那么select是您的select。
希望它可以帮助你。
它已经为你完成了。 使用Autolayout来创build你的UI( NSLayoutConstraint
)。 在创build水平视图层次结构时,使用NSLayoutAttributeLeading
和NSLayoutAttributeTrailing
属性。 首先将对应英文设备区域设置的左边缘和阿拉伯语的右边缘。 反之亦然
最好的办法是用NSLayoutConstraint来pipe理它。 请参考下面的伪码:
- (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 */ } }