2012-07-05 14 views

risposta

28

In iOS 9 è possibile determinare la direzione corrente per ogni singola vista.

if #available(iOS 9.0, *) { 
    if UIView.userInterfaceLayoutDirection(
    for: myView.semanticContentAttribute) == .rightToLeft { 

     // The view is shown in right-to-left mode right now. 
    } 
} else { 
    // Use the previous technique 
    if UIApplication.shared.userInterfaceLayoutDirection == .rightToLeft { 

     // The app is in right-to-left mode 
    } 
} 

Questo è il modo consigliato di determinare la direzione layout in IOS 9.

WWDC 2015 Video New UIKit Support for International User Interfaces. Dopo il minuto 31:20.

+1

Esiste comunque una risposta come "corretta ora"? Per i posteri, la risposta che ho scelto tre anni fa era corretta al momento, ma probabilmente dovrebbe essere più in alto. – BarrettJ

+0

@BarrettJ puoi sempre annullare l'accettazione e accettare un'altra risposta. – SmokeDispenser

+1

È ora 'UIView.userInterfaceLayoutDirectionForSemanticContentAttribute (semanticContentAttribute) == .RightToLeft'. – ChrisB

17

NSLocale ha due metodi +characterDirectionForLanguage: e +lineDirectionForLanguage:. Il primo è presumibilmente da sinistra a destra vs da destra a sinistra e il secondo è dall'alto verso il basso e dal basso verso l'alto. Puoi passarlo il risultato di [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode].

Aggiornamento:

La domanda iniziale chiesto era quello di determinare se la lingua del dispositivo è RTL. Usare +[NSLocale characterDirectionForLanguage:] e +[NSLocale lineDirectionForLanguage:] è chiaramente corretto per quello; è possibile passare a [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode] o [NSLocale preferredLanguages][0] a quello per ottenere le informazioni rilevanti (non sono sicuro se il NSLocaleLanguageCode utilizza la lingua preferita o l'area impostata).

Tuttavia, è molto probabile che ciò che il poster originale volesse sapere è se l'interfaccia dell'applicazione debba essere presentata in RTL o LTR. Questo è molto simile a chiedere qual è la direzione della lingua, tranne che prende in considerazione le localizzazioni disponibili dell'applicazione. Se l'applicazione non è localizzata nella lingua preferita dell'utente, utilizzerà invece una lingua non preferita. E la risposta a questa domanda è usare [UIApplication sharedApplication].userInterfaceLayoutDirection.

+4

Purtroppo questo non è corretto; il modo migliore per farlo è attraverso '' '[UIApplication sharedApplication] .userInterfaceLayoutDirection''', come menzionato nella [risposta di seguito] (http://stackoverflow.com/a/25500099/242849). – wakachamo

+1

Giù votando questa risposta. Vedi il commento di 'wakachamo' per il modo migliore per determinare la direzione del layout dell'interfaccia. – Sean

+4

@wakachamo: la domanda che veniva posta era determinare se la lingua fosse RTL. '[UIApplication sharedApplication] .userInterfaceLayoutDirection' dichiara se la direzione dell'interfaccia deve essere impostata su LTR o RTL. Questa non è esattamente la stessa cosa che la domanda stava ponendo. Anche se potrebbe essere in effetti ciò che voleva il poster originale. –

4

Grazie alla risposta di Kevin Ballard sono stato in grado di creare la seguente funzione di utilità per fare questo:

+ (BOOL)isDeviceLanguageRTL { 
    return [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]]==NSLocaleLanguageDirectionRightToLeft; 
} 
+0

Sebbene la risposta di @ Accatyyc sia tecnicamente corretta, nel mio caso non ha restituito il valore corretto. Eseguo il test su iOS8, cambio lingua in arabo ma il metodo 'userInterfaceLayoutDirection' ha restituito LTR. Così ho provato questa risposta e ha risolto il mio problema. – FormigaNinja

10

Assicurarsi ritorni la lingua attualmente selezionata, non la regione corrente del dispositivo. La regione e la lingua sono spesso le stesse. Tuttavia, se sono in Nord America e ho impostato la lingua giapponese, la mia regione sarà ancora inglese (Stati Uniti). Al fine di controllare la direzione di caratteri della lingua selezionata, si può fare:

+ (BOOL)isDeviceLanguageRTL { 
    return ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft); 
} 

Potrebbe essere probabile che vogliono memorizzare nella cache il risultato, utilizzando dispatch_once.

Ricordare che questa è la direzione della lingua preferita dell'utente e non necessariamente la direzione della lingua del testo. Per questo, utilizzare una funzione C basata su u_charDirection.

+0

Anche questa risposta è sbagliata - guarda la mia risposta. – Accatyyc

0

Rose Perrone è completamente corretto. Tuttavia l'uso di dispatch_once in un getter per un semplice valore booleano - è davvero troppo sovraccarico. Uso non necessario della spedizione una volta. Perché probabilmente vorrai usarlo più volte all'interno di un layout o di una funzione di disegno.

in modo da avere due opzioni più veloci:

+ (BOOL)isRtl 
{ 
    static BOOL isRtl = NO; 
    static BOOL isRtlFound = NO; 
    if (!isRtlFound) 
    { // This is "safe enough". Worst case is this code will be called twice in the app's lifecycle... 
     isRtl = [NSLocale characterDirectionForLanguage:[NSBundle mainBundle].preferredLocalizations[0]] == NSLocaleLanguageDirectionRightToLeft; 
     isRtlFound = YES; 
    } 
    return isRtl; 
} 

O semplicemente memorizzare nella cache in una variabile statica, utilizzando il costruttore statico:

static BOOL s_isRtl = NO; 
+ initialize 
{ 
    s_isRtl = [NSLocale characterDirectionForLanguage:[NSBundle mainBundle].preferredLocalizations[0]] == NSLocaleLanguageDirectionRightToLeft; 
} 

Si noti che questo sarà effettivamente condividere la variabile statica tra un qualsiasi classe che usa questo codice.

+0

aggiornamento dispatch_once: "Questa funzione è utile per l'inizializzazione di dati globali (singleton) in un'applicazione.Tenuta sempre questa funzione prima di utilizzare o testare le variabili inizializzate dal blocco. Se chiamato contemporaneamente da più thread, questa funzione attende sincrono fino al completamento del blocco Il predicato deve puntare a una variabile memorizzata in ambito globale o statico. " – SK9

1

Ecco come l'ho usato:

+(NSTextAlignment) alignmentOfLanguage { 
if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]]==NSLocaleLanguageDirectionRightToLeft){ 
     return NSTextAlignmentRight; 
    } 
    return NSTextAlignmentLeft; 
} 

L'ultimo esempio non ha funzionato per me, ma con un po variante, ho capito rightX2.

eventuali commenti?

36

C'è un modo ufficiale per farlo:

if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft) { 
} 

mi sento di raccomandare di non usare alcune delle altre soluzioni, perché non torneranno sempre le impostazioni internazionali corrette. Solo perché è nella parte superiore delle lingue preferite non significa che l'applicazione lo supporti.

Fonte: https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/SupportingRight-To-LeftLanguages/SupportingRight-To-LeftLanguages.html

+0

Questo è (dato il senso poco chiaro della domanda dell'OP) molto probabilmente ciò che l'OP voleva. – Sean

+0

Si prega di notare che Apple ha aggiornato i loro documenti, e ora raccomanda un metodo diverso che è solo iOS 9. Vedi: http://stackoverflow.com/a/31759275/785716 – Keab42

+0

Io lo uso in certi casi, anche su iOS 9, poiché a volte semplicemente non hai un'istanza di un UIView per controllare il semanticContentAttribute. – Mike

1

Ok, anche se è una vecchia questione con una risposta accettata, risponderò comunque.

Per coloro che vogliono verificare se la lingua del dispositivo è RTL, indipendente se l'applicazione supporta o no questa lingua, è necessario utilizzare [NSLocale characterDirectionForLanguage:] come questo:

+ (BOOL)isDeviceLanguageRightToLeft { 

    NSLocale *currentLocale = [NSLocale currentLocale]; 
    NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLanguage:[currentLocale objectForKey:NSLocaleLanguageCode]]; 
    return (direction == NSLocaleLanguageDirectionRightToLeft); 
} 

Il codice di cui sopra tornerà YES se la tua app supporta solo l'inglese, ad esempio il tuo dispositivo è impostato su arabo.

Apple consiglia di utilizzare [UIApplication sharedApplication].userInterfaceLayoutDirection, solo perché restituisce la direzione in base alla lingua utilizzata dall'app (supporta). Ecco il frammento di codice:

+ (BOOL)isAppLanguageRightToLeft { 

    NSLocaleLanguageDirection direction = [UIApplication sharedApplication].userInterfaceLayoutDirection; 
    return (direction == UIUserInterfaceLayoutDirectionRightToLeft); 
} 

Il codice di cui sopra restituirà NO quando la vostra applicazione supporta solo inglese, ma il dispositivo è impostata su arabo, per esempio.

0
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) { 
    if ([UIView userInterfaceLayoutDirectionForSemanticContentAttribute:self.view.semanticContentAttribute] == UIUserInterfaceLayoutDirectionRightToLeft) { 
     NSLog(@"Right to left"); 
    } 
    else{ 
     NSLog(@"left to Right"); 
    } 
} else { 
    /* Use the previous technique */ 
    //Work for earlier ios 6 to ios 10 
    if ([NSLocale characterDirectionForLanguage:[[NSLocale preferredLanguages] objectAtIndex:0]] == NSLocaleLanguageDirectionRightToLeft) { 
     NSLog(@"Right to left"); 
    } 
    else{ 
     NSLog(@"left to Right"); 
    } 
} 

deve guardare Advanced Topics in Internationalization wwdc2014

3

Ecco un rapido 3 Versione:

import UIKit 

extension UIView 
{ 
    /// Returns text and UI direction based on current view settings 
    var userInterfaceLayoutDirection: UIUserInterfaceLayoutDirection 
    { 
     if #available(iOS 9.0, *) { 
      return UIView.userInterfaceLayoutDirection(for: self.semanticContentAttribute) 
     } else { 
      return UIApplication.shared.userInterfaceLayoutDirection 
     } 
    } 
} 
0

se si desidera controllare se il dispositivo è in esecuzione in RTL o LTR a Swift 3

if(UIApplication.shared.userInterfaceLayoutDirection == UIUserInterfaceLayoutDirection.rightToLeft) { 
    //RTL 
} else { 
    //LTR 
} 
Problemi correlati