2016-03-14 3 views
3

Я знаю, что у iOS есть поддержка RTL (справа налево) для языков, и что с помощью leading and trailing constraints я «расскажу» autolayout, чтобы складывать элементы в соответствии с ориентацией на язык. Все это отлично работает. Если я хочу, чтобы constraint был исправлен, я отказываюсь от уважения к языку, и проблем нет. Однако мне нужно сделать выбор языка приложения, который будет иметь языки LTR и RTL. Как сигнализировать приложение, чтобы зеркалировать представление RTL и наоборот? Я знаю, что это можно было бы сделать, если бы я перебирал ограничения и менял ведущие/конечные слева направо и наоборот, но есть ли более простые решения для этого? Перезапуск приложения также при необходимости! Решение должно поддерживать iOS 8.x + СпасибоПоддержка Autolayout RTL в приложении

ответ

2

Перезапуск приложения не требуется никакое другое решение.

Руководство Apple предлагает разработчикам не реализовывать выбор языка внутри приложения. Разработчик должен использовать выбранный язык устройства.

Если вы запрашиваете способ перезагрузки приложения. это тоже невозможно. Вы можете показать предупреждение, чтобы пользователь попросил его перезапустить. закрытие viewcontrollers также не решит проблему.

Обычно я не включаю локализацию для своего приложения, если я хочу реализовать выбор langauge в приложении. К сожалению, я все ограничения кодирования.

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

+0

Я думал о перезагрузке раскадровки внутри вида контейнера на каком-то «корневом» контроллере вида, что вызовет повторное рисование всего приложения. Но я до сих пор не знаю, как заставить ориентацию, я могу сделать это в iOS9.x, но я не вижу никакой другой опции, а затем меняет направление влево и заканчивается вправо до того, как появится представление при повторном рисовании контроллера. – zevonja

+0

Да, в конце вы должны пойти и закодировать. изменение ведущего и конечного вправо и влево по коду в зависимости от языка выглядит хорошо. – hasan83

+1

+1 о настроениях hasan83 относительно переключателей языка в приложении. Это будет очень запутанный пользовательский интерфейс, если ваше приложение не будет автоматически автоматически следовать за системным языком. – wakachamo

-1

hasan83 Ответ очень полезен, но я хотел бы поделиться тем, что я сделал, чтобы поддерживать как право-левый, так и левый-правый язык.

Как hasan83 правильно указал в ответе, что «требуется перезапуск приложения», чтобы изменить интерфейс справа налево и влево-вправо наоборот.

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

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

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

+0

Переопределение языка NSUserDefaults во время выполнения не рекомендуется и все равно не будет работать для системного интерфейса, представленного вашим приложением, или форматировщиков, которые использует ваше приложение. – wakachamo

+0

Не могли бы вы объяснить, что вы подразумеваете под «\t . Переопределение языка NSUserDefaults во время выполнения не рекомендуется». Я объяснил, как с помощью этого можно позволить своим пользователям изменять язык внутри самого приложения, это не имеет никакого отношения к языку системы/ОС. В настоящее время я работаю над приложением, в котором я обработал изменение языка приложения (так как мой клиент хочет предоставить возможность изменения языка приложения для своих пользователей), и я не сталкивался с какой-либо проблемой ни в чем (System UI ..), поэтому далеко (приложение 80% завершено). Мне больше нравится от вас, если вы считаете, что это не рекомендуется/неправильно. –

+0

Моей точкой является изменение языков внутри самого приложения, не рекомендуется. Это запутает ваших пользователей, потому что они ожидают, что приложение будет постоянно следить за системным языком. При переключении между LTR и языками RTL внутри приложения вы столкнетесь с проблемами и неожиданными ошибками, а форматы даты, а также любой пользовательский интерфейс системы (например, UIActivityViewController) не будут уважать установленный вами язык. Пожалуйста, не делайте этого. – wakachamo