2015-07-29 18 views
19

Moja aplikacja na iOS jest tylko w języku arabskim (od prawej do lewej). Przed iOS 9 układ widoków i animacje widoku były domyślnie od lewej do prawej. Tak więc dostosowałem całą aplikację i odwróciłem domyślne zachowanie, np. przycisk Wstecz w pasku nawigacji był ustawiony po prawej zamiast domyślnej lewej.iOS 9 wyłącza obsługę języka pisanego od prawej do lewej

Ale teraz, gdy aplikacja jest kompilowana przy użyciu najnowszego SDK (Xcode 7 beta 4), wszystko jest przeciwieństwem tego, czego potrzebuję.

Czy istnieje prosty sposób zmuszenia aplikacji do wyświetlania wyświetleń i zachowania się jak iOS 8 i 7?

Poszukałem i znalazłem rozwiązanie, ale wiąże się to ze zmianą ograniczeń (odznacz "Kierunek zachowania języka") dla wszystkich widoków. Ale nie jest to wykonalne rozwiązanie w dużych projektach.

To jest zrzut ekranu po kompilacji z Xcode 7 Beta 4. .

i jest to zrzut ekranu, gdy skompilowany z Xcode 6. enter image description here

+0

Czy próbowałeś odpowiedzi w poście? –

Odpowiedz

6

Nie ma łatwy sposób. Zaleca się, aby migracja do standardowego interfejsu API była możliwie długotrwała.

Innym podejściem jest ustawienie semanticContentAttribute wszystkich dotkniętych widoków na , ale jest to tak samo możliwe, jak ustawienie wszystkich ograniczeń użycia lewej/prawej strony zamiast opcji Wyprowadzanie/Kończenie. Oprócz tego trzeba również zablokować te połączenia wokół sprawdzania dostępności, jeśli kierujesz na system iOS < 9.

+0

Mam problem z symbolem zastępczym UITextField. nadal wyświetla się od prawej do lewej. Próbowałem zmienić: UITextField.appearance(). semanticContentAttribute i UITextField.appearance(). UITextField.appearance(). makeTextWritingDirectionLeftToRight (nil) ale bezużyteczny – iosMentalist

22

Edytuj: Poniższy kod może spowodować nieoczekiwane zachowanie, jak wskazano w @wakachamo. Więc uważaj na problemy, np. Interaktywny popowy gest nie działa, alarmy się nie pokazują, itp. Lepiej postępować zgodnie z instrukcjami podanymi przez @wakachamo, jeśli to nie działa dla ciebie

Dodaj to do aplikacji delegata metody didFinishLaunchingWithOptions.

[[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight]; 

Należy również dodać osłonę do obsługi wcześniejszej wersji, aby właściwość nie powodowała awarii.

if([[[UIView alloc] init] respondsToSelector:@selector(setSemanticContentAttribute:)]) { 
     [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight]; 
    } 

[[UIView Alloc] startowych] zamiast [wygląd UIView respondsToSelector], ponieważ nie jest obecnie z [wygląd UIView] dla setSemanticContentAttribute. Możesz także dodać iOS 9 Check

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) { 
     [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight]; 
    } 
+0

To nie jest obsługiwana konfiguracja i będzie prowadzić do wielu błędów i niespójności w swojej aplikacji. – wakachamo

+0

Tak, może tak być, ale jest to jedyna rzecz, która działa do tej pory dla kontrolerów nawigacyjnych, aby zrobić to od lewej do prawej, o ile wiem. Dla pojedynczych elementów semanticContentAttribute działa najlepiej, jak opisałeś. –

+0

Dzięki chłopaki! Znalazłem prostsze rozwiązanie dla mojej sprawy. Proszę zobaczyć moją odpowiedź. –

11

Wiem, że jest za późno na odpowiedź. Ale odkryłem to (tylko kwestia paska nawigacji).

Odpowiedź jest zaadaptowana z @Kamran Kan. Dzięki @Kamran.

Jus wymienić UIView z UINavigationBar w @ odpowiedź Kamran za. wtedy kod będzie następujący.

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) { 
    [[UINavigationBar appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight]; 
} 

Ponieważ jest to efekt tylko paska UINavigationBar, pozostałe elementy sterujące nie będą działać. Więc UIAlertView działa dobrze ...

+1

idealna odpowiedź dla paska nawigacji – Mehul

+0

Dzięki, ta odpowiedź działa dla mojego pytania https://stackoverflow.com/questions/45736141/position-of-navigation-buttons-in-rtl-languages-is-not-correct-in-ipad? Noredirect = 1 # comment78460346_45736141 –

16

znalazłem właściwą drogę od firmy Apple Developer Forum

tutaj iOS 9 beta - UIAlertController is not working

Wystarczy dodać ten kod, aby alertview z nim pracować

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) { 
      [[UIView appearance] setSemanticContentAttribute:UISemanticContentAttributeForceLeftToRight]; 

    [[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setSemanticContentAttribute:UISemanticContentAttributeUnspecified]; 
    [[UIView appearanceWhenContainedIn:[UIAlertView class], nil] setSemanticContentAttribute:UISemanticContentAttributeUnspecified]; 



} 
+0

Dziękuję człowieku ... Itz działa dobrze ... –

+0

To nie działa właściwie http://stackoverflow.com/questions/32932463/rtl-language-behavior-in-ios-9 –

5

SWIFT 2 Kod

if #available(iOS 9.0, *) { 
    myView.semanticContentAttribute = .ForceLeftToRight 
} 
2

Dla SWIFT 3

if #available(iOS 10.0, *) { 
    UIView.appearance().semanticContentAttribute = .forceLeftToRight 
} 
2

Wykorzystanie ujęć i wybrać dla każdego konkretnego kontrolerów widoku

Semantic-> Siła lewej do prawej.

Force Left-to-Right

Powiązane problemy