2016-07-28 3 views
0

Я работаю над приложением, поддерживающим английский и арабский языки.Как перенести все UIView слева направо в iOS? (Objective-C)

Мое требование, когда я выбираю английский, все UIView s должно отображаться слева направо.
(то есть. На левой стороне есть UIImageView и UILabel на правой из UIImageView см на рис ниже)

Но когда пользователь может выбрать арабский язык, то UIImageView должны прийти к правой стороне экрана и UILabel должны слева от UIImageView.

Можно ли сделать в iOS или я должен создать separte ViewController макет для арабского языка ????

Здесь я должен изменить свои компоновки

enter image description here

+0

Предоставляете ли вы вариант изменения языка в самом приложении, например, с экрана настройки или что-то в этом роде? Вы использовали локализацию –

+1

Да, я предоставил метод на странице настроек – Dhiru

+0

@Dhiru, это на самом деле не очень хорошая идея. Плохая практика, и я рекомендую вам придерживаться инструментов интернационализации. Apple уже предоставила разработчикам: https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/Introduction/Introduction.html –

ответ

1

Есть два способа локализации,

  • Локализация - Вы можете сделать это с помощью одного раскадровки, вы просто должны тщательно установите ограничение на ведущее пространство и трейлинг-пространство, и по мере изменения языка ОС позаботится о создании зеркального изображения английской версии Views (особенно для языков RTL). Как это работает, когда вы меняете язык с установки устройства, а затем при запуске приложения iOS проверяет выбранный язык, а затем загружает раскадровку для этого конкретного языка, но в вашем случае вы должны предоставить функцию изменения языка в самом приложении, тогда вам нужно написать дополнительный код для изменения языка на лету.

  • Создание отдельной раскадровки - Во-вторых один создает отдельные раскадровки для каждого языка и дизайн экранов для английского языка первым затем просто скопировать и вставить тот же на арабском языке раскадровки и просто перенести компонент, чтобы сделать зеркальное изображение тоже самое.

Примечание:

В обоих случаях вы предоставляете пользователю изменить язык приложения в самом приложении, чтобы для этого вы должны принять некоторые дополнительные усилия, поскольку поведение по умолчанию локализации вещи вам необходимо перезапустить приложение, чтобы увидеть эффект, и язык приложения изменится при изменении языка устройства, вы не можете просто изменить язык «на лету» и увидеть изменение пользовательского интерфейса, этого не произойдет.

Так что вы должны сделать в плане кодирования части, чтобы изменить язык в приложение и пользователь должен иметь возможность видеть интерфейс на выбранном языке объясняется ниже,

Какой лучше?

Если приложение имеет простой интерфейс и также имеет небольшой объем, то вы можете пойти на локализацию, которая представляет собой единый раскадровки для нескольких языков.

Но если приложение имеет сложный интерфейс и объем приложения также довольно большой, я бы предложил вам перейти на отдельную раскадровку, так как использование локализации имеет некоторые ограничения или мы можем сказать, что сложно установить ограничения для сложных 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, так как это может привести к путанице между выбранным языком устройства и языком приложения, но если это ваше требование, и вы должны это сделать, твой выбор.

Надеюсь, это поможет вам.

+1

Большое спасибо за ваш ответ !!!! – Dhiru

+2

Вы можете проголосовать и принять ответ, который решает вашу проблему, это поможет другим людям, которые сталкиваются с такой же проблемой. –

0

Это уже сделано за вас. Используйте Autolayout для создания пользовательского интерфейса (NSLayoutConstraint). При создании иерархии горизонтального представления используйте атрибуты NSLayoutAttributeLeading и NSLayoutAttributeTrailing. Сначала будет соответствовать левому краю в английском языке, а также на правом краю на арабском языке. И наоборот

Проверить этот учебник для получения дополнительной информации https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/InternationalizingYourUserInterface/InternationalizingYourUserInterface.html

0

Лучший способ сделать это - управлять им с помощью 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 
    */ 
} } 
+1

Спасибо за ваш ответ, но можете ли вы рассказать мне, как я могу деактивировать ограничение слева и справа на ярлык и активировать ограничение справа налево? программно? – Dhiru

+1

@Dhiru, вы можете использовать следующий метод NSLayoutConstriant для дезактивации ограничений программно. [NSLayoutConstraint deactivateConstraints: NSArray ]; –