2010-09-07 13 views
73

Witam Zastanawiam się, czy istnieje sposób, aby programowo uzyskać szerokość.IPhone/iPad: Jak programowo uzyskać szerokość ekranu?

Szukam czegoś dość ogólnego, aby pomieścić iPhone 3gs, iphone 4, ipad. Również szerokość powinna zmieniać się w zależności od tego, czy urządzenie jest portretowe czy poziome (dla iPada).

Ktoś wie, jak to zrobić? Szukałem przez chwilę ... dzięki!

+0

Czy szerokość ekranu, szerokość dostępnej przestrzeni aplikacji (bez paska systemowego) lub szerokość konkretnego widoku, którego szukasz? – VdesmedT

+0

hrmm Nie jestem pewien. Chyba chciałem szerokości urządzenia (tj. w ipad 768 dla szerokości portretu i 1024 dla szerokości krajobrazu), ale self.view.bounds wydawało się to satysfakcjonować. zobacz mój komentarz poniżej – foreyez

+0

Zobacz [to bardziej wyczerpująca odpowiedź] (http://stackoverflow.com/a/7905540/17339), który uwzględnia orientację urządzenia. –

Odpowiedz

179

Spójrz na UIScreen.

np.

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

Spójrz na właściwość applicationFrame, jeśli nie chcesz, aby pasek stanu był włączony (nie wpłynie na szerokość).

AKTUALIZACJA: Okazuje się, że UIScreen (-bounds lub -applicationFrame) nie uwzględnia bieżącej orientacji interfejsu. Poprawniejszym podejściem byłoby zapytanie użytkownika UIView o jego granice - zakładając, że to UIView zostało automatycznie obrócone przez kontroler View.

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

Jeśli widok nie jest automatycznie obracany przez View Controller następnie trzeba będzie sprawdzić orientację interfejsu, aby określić, która część widoku granicach oznacza „szerokość” i „wysokość”. Zwróć uwagę, że właściwość frame daje ci podgląd widoku w przestrzeni współrzędnych UIWindow, która (domyślnie) nie uwzględnia orientacji interfejsu.

+3

w rzeczywistości, to nie działa, gdy ipad jest zorientowany krajobraz .. tj., Jeśli mój symulator działa krajobraz, to nadal zwraca 768 (zamiast 1024). myślisz, że powinienem mieć instrukcję if, która sprawdza orientację w takim przypadku lub czy istnieje lepszy sposób na uzyskanie szerokości? – foreyez

+0

Cholera - zgadza się, że masz rację; Zaktualizowałem moją odpowiedź, dodając kilka pomysłów. –

+0

Skończyłem właśnie używając "CGFloat width = CGRectGetWidth (self.view.bounds);" w mojej metodzie (nie ma potrzeby do didRotateFromInterfaceOrientation) ... tak atleast self.view.bounds bierze pod uwagę orientację. dzięki!! – foreyez

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

nie uwzględnia orientacji – rimsky

5

Można to zrobić w w 3 linii kodu:

// 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

to jest blisko, ale jeśli jest wyświetlony UIAlertView będzie kluczem okno, a jego właściwość rootViewController będzie zerowa –

+0

@mattbezark prawda. Uważam jednak, że jest to sprawa na rogu. Istnieje alternatywa, aby uzyskać widok główny - nie tak czysty, jak ten, ale opublikuję alternatywę na wypadek, gdyby ktoś był zainteresowany. – memmons

+0

Dziękuję. Ta praca na iOS 7 i 8. –

-2

Oto Swift sposób, aby uzyskać rozmiarów ekranu, to także bierze bieżącej orientacji interfejsu pod uwagę:

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 
} 

Są one zawarte jako funkcje standardowe w:

https://github.com/goktugyil/EZSwiftExtensions

0

Od wersji iOS 9.0 nie można uzyskać niezawodnej orientacji. Jest to kod użyłem do aplikacji Projektuję dla trybu tylko portretowej, więc jeśli aplikacja jest otwarty w trybie poziomym to nadal będzie dokładna:

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

użyć tego kodu pomoże

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

wykorzystanie:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ; 
Powiązane problemy