2010-09-07 14 views
73

Ciao Mi chiedo se c'è un modo per ottenere la larghezza a livello di codice.IPhone/IPad: come ottenere la larghezza dello schermo a livello di programmazione?

Sto cercando qualcosa di abbastanza generale da contenere iphone 3gs, iphone 4, ipad. Inoltre, la larghezza dovrebbe cambiare in base a se il dispositivo è verticale o orizzontale (per ipad).

Qualcuno sa come fare questo ?? Ho cercato un po '... grazie!

+0

è la larghezza dello schermo, la larghezza dello spazio di applicazione disponibile (senza la barra di sistema) o la larghezza di una vista particolare che state cercando? – VdesmedT

+0

hrmm non sono sicuro. Credo che volevo solo la larghezza del dispositivo (cioè in ipad 768 per la larghezza verticale e 1024 per la larghezza orizzontale) ma self.view.bounds sembrava soddisfare questo. vedere il mio commento sotto – foreyez

+0

Vedere [questa risposta più completa] (http://stackoverflow.com/a/7905540/17339) che tiene conto dell'orientamento del dispositivo. –

risposta

179

Dai uno sguardo allo UIScreen.

es.

CGFloat width = [UIScreen mainScreen].bounds.size.width; 

Date un'occhiata alla proprietà applicationFrame se non si desidera che la barra di stato incluso (non influenzerà la larghezza).

UPDATE: Si scopre che UIScreen (-bounds o -applicationFrame) non tiene conto dell'orientamento dell'interfaccia corrente. Un approccio più corretto sarebbe chiedere al tuo UIView i suoi limiti - presumendo che questo UIView sia stato automaticamente ruotato dal suo View controller.

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    CGFloat width = CGRectGetWidth(self.view.bounds); 
} 

Se la vista non è in fase di auto-rotazione da parte del controllore View allora si avrà bisogno di controllare l'orientamento di interfaccia per determinare quale parte dei limiti vista rappresenta il 'width' e 'height'. Si noti che la proprietà frame fornirà il rect della vista nello spazio delle coordinate dell'UIWindow che (per impostazione predefinita) non prenderà in considerazione l'orientamento dell'interfaccia.

+3

in realtà, questo non funziona quando l'ipad è orientato in orizzontale ... cioè, se il mio simulatore è in esecuzione orizzontale, restituisce comunque 768 (anziché 1024). pensi che dovrei avere una dichiarazione if che controlli l'orientamento in quel caso o c'è un modo migliore per ottenere larghezza? – foreyez

+0

Dannazione: sembra che tu abbia ragione; Ho aggiornato la mia risposta con altre idee. –

+0

Ho finito per usare solo "CGFloat width = CGRectGetWidth (self.view.bounds);" nel mio metodo (non c'è bisogno di didRotateFromInterfaceOrientation) ... così atleast self.view.bounds prende in considerazione l'orientamento. Grazie!! – foreyez

9
CGRect screen = [[UIScreen mainScreen] bounds]; 
CGFloat width = CGRectGetWidth(screen); 
//Bonus height. 
CGFloat height = CGRectGetHeight(screen); 
+10

non tiene conto dell'orientamento – rimsky

5

Questo può essere fatto in in 3 linee di codice:

// grab the window frame and adjust it for orientation 
UIView *rootView = [[[UIApplication sharedApplication] keyWindow] 
            rootViewController].view; 
CGRect originalFrame = [[UIScreen mainScreen] bounds]; 
CGRect adjustedFrame = [rootView convertRect:originalFrame fromView:nil]; 
+3

questo è vicino, ma se viene visualizzato un UIAlertView sarà la finestra chiave e la sua proprietà rootViewController sarà nil –

+0

@mattbezark True. Lo considero comunque un caso d'angolo. C'è un'alternativa per ottenere la vista root - non pulita come questa, ma pubblicherò l'alternativa nel caso in cui qualcuno sia interessato. – memmons

+0

Grazie. Questo lavoro su iOS 7 e 8. –

-2

Ecco un modo rapido per ottenere dimensioni dello schermo, questo richiede anche orientamento interfaccia corrente in considerazione:

var screenWidth: CGFloat { 
    if UIInterfaceOrientationIsPortrait(screenOrientation) { 
     return UIScreen.mainScreen().bounds.size.width 
    } else { 
     return UIScreen.mainScreen().bounds.size.height 
    } 
} 
var screenHeight: CGFloat { 
    if UIInterfaceOrientationIsPortrait(screenOrientation) { 
     return UIScreen.mainScreen().bounds.size.height 
    } else { 
     return UIScreen.mainScreen().bounds.size.width 
    } 
} 
var screenOrientation: UIInterfaceOrientation { 
    return UIApplication.sharedApplication().statusBarOrientation 
} 

Questi sono inclusi come funzione standard in:

https://github.com/goktugyil/EZSwiftExtensions

0

A partire da iOS 9.0 non è possibile ottenere un orientamento affidabile. Questo è il codice che ho usato per un app Io disegno per la modalità ritratto solo, quindi se l'applicazione viene aperta in modalità orizzontale sarà ancora accurate:

screenHeight = [[UIScreen mainScreen] bounds].size.height; 
screenWidth = [[UIScreen mainScreen] bounds].size.width; 
if (screenWidth > screenHeight) { 
    float tempHeight = screenWidth; 
    screenWidth = screenHeight; 
    screenHeight = tempHeight; 
} 
0

Usa questo codice aiuterà

[[UIScreen mainScreen] bounds].size.height 
[[UIScreen mainScreen] bounds].size.width 
0

uso:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ; 
Problemi correlati