2014-12-29 7 views
7

Mam kilka widoków w mojej aplikacji, które muszą być w stanie wyświetlać zarówno zawartość LTR, jak i RTL (nie w tym samym czasie), a to musi być niepowiązane do ogólnego kierunku układu aplikacji. To znaczy, chcę móc powiedzieć konkretny widok, aby odwrócić jego układ z LTR na RTL i odwrotnie, w locie, bez zmiany języka systemu.

Badałem to całkiem sporo, ale na bok z dwóch poniższych rozwiązań, wydaje się, że nie jest możliwe:
Flip layout on iPhone for RTL languages
How to force "Respect Language Direction" from RTL to LTR and vice versa

Pierwsze rozwiązanie nie jest odpowiednie w moim przypadku. Drugie rozwiązanie pozwoliło mi zachować dwie wersje dla każdego widoku, jeden dla RTL i jeden dla LTR, i użyć odpowiedniego na bieżąco. Oznacza to, że będę musiał dwukrotnie zaktualizować widoki każdej aktualizacji interfejsu użytkownika.

Trzecie rozwiązanie polega na ręcznej zmianie układu widoku, programowo, zgodnie z odpowiednim kierunkiem, przed wyświetleniem widoku.

Więc, czy to są moje jedyne opcje?

P.S: Mówię tylko o układzie, a nie o ciągach lokalizacji, ponieważ sam zajmuję się właściwym tekstem.ios 7 - Układ widoku siły odwraca się do RTL bez zmiany języka

+0

miałeś szczęście w implementacji tego? – user2695433

+0

@ user2695433 checkout my answer. – Sayakiss

Odpowiedz

2

Począwszy od wersji iOS 9, można to teraz zrobić za każdym razem, korzystając z właściwości UIView o wartości UIView. Jeśli korzystasz z automatycznego układu lub jeśli twoje elementy sterujące pochodzą/dziedziczą z UIKit, powinny po prostu robić to, co właściwe, gdy ta właściwość jest ustawiona.

Należy pamiętać, że w przypadku etykiet, pól tekstowych i widoków może zajść konieczność zmiany wyrównania tekstu w zależności od wyświetlanego tekstu.

7

Znalazłem to dość łatwe do wdrożenia, że ​​tak:

func setRTL(_ sender: UIButton) { 
    UIView.appearance().semanticContentAttribute = .forceRightToLeft 
    UINavigationBar.appearance().semanticContentAttribute = .forceRightToLeft 
    if let vc = storyboard?.instantiateViewController(withIdentifier: "root") { 
     UIApplication.shared.keyWindow?.rootViewController = vc 
    } 
} 

Preview:

i sprawdzić pełną DEMO.

Powiązane problemy