2011-09-14 13 views

risposta

66

Il NSLocale può dire:

NSLocale *locale = [NSLocale currentLocale]; 
BOOL isMetric = [[locale objectForKey:NSLocaleUsesMetricSystem] boolValue]; 

Solo tre paesi non usano il sistema metrico: gli Stati Uniti, la Liberia e Myanmar. Più tardi usa il proprio sistema, i primi due usano Unità Imperiali.

Mele documentazione dice (sottolineatura mia):

NSLocaleUsesMetricSystem

La chiave per la bandiera che indica se le impostazioni internazionali usa il sistema metrico. Il valore corrispondente è un oggetto NSNumber booleano. Se il valore è NO, in genere è possibile assumere unità di misura americane (ad esempio, il miglio statuto).

Disponibile in iOS 2.0 e versioni successive.

+4

NB: il Regno Unito utilizza una combinazione di metrica e imperiale. I pesi tendono ad essere misurati in kg, ma la distanza (specialmente sulle strade) è ancora in miglia. –

+0

@DarkDust Grazie, è stata davvero una soluzione. Il mio unico problema ora è come aggiornare le impostazioni nella mia app se l'utente cambia le impostazioni locali dalle preferenze di iPad, mentre eseguo la mia app in multitasking. Posso solo controllare la vista in viewDidAppear ma esiste una soluzione migliore? – aneuryzm

+1

@Patrick: selezionare il metodo 'applicationDidBecomeActive:' di 'UIApplicationDelegate' (o sottoscrivere la notifica corrispondente,' UIApplicationDidBecomeActiveNotification') e/o iscriversi a 'NSCurrentLocaleDidChangeNotification'. – DarkDust

1

Probabilmente si dovrebbe solo avere un ambiente nella tua app e consentire agli utenti di scegliere - questo è ciò che Apple fa in app Meteo.

Se si desidera scegliere un valore predefinito, è possibile osservare le impostazioni locali. Se sono Stati Uniti, scegli imperiale, altrimenti scegli la metrica. È un euristico, a volte sarà sbagliato, ma è solo un valore predefinito che può essere modificato.

+0

che sto cercando di fare esattamente questo. Ho un controller di visualizzazione che dovrebbe mostrare il sistema di unità (cm/ft e pollici) e convertire tra i due. Ho creato un pacchetto di impostazioni con un interruttore (off: metrico/on: imperiale, predefinito: spento). funziona quando avvio l'app per la prima volta. tuttavia, se cambio in imperiale, quel cambiamento passa ma un cambiamento di ritorno a off (-> metrico) non ha alcun effetto. idee? – coernel

13

ecco una rapida versione

var locale = NSLocale.currentLocale() 
let isMetric = locale.objectForKey(NSLocaleUsesMetricSystem) as! Bool 
+2

Grazie! Per Swift 2 sarà: let locale = NSLocale.currentLocale() – Lucas

7

per SWIFT 3

let locale = NSLocale.current 
    let isMetric = locale.usesMetricSystem 
+0

Ma solo per iOS 10+; non mi è chiaro come lo faresti in un'app Swift 3 con targeting per iOS 9. – JLundell

+2

'Locale.current.usesMetricSystem' funziona bene su iOS 9. –

11

risposta @DarkDust per swift3

//User region setting return 
let locale = Locale.current //NSLocale.current 

//Returns true if the locale uses the metric system 
let isMetric = locale.usesMetricSystem 
Problemi correlati