IPhone / iPad: jak programowo uzyskać szerokość ekranu?

83

Cześć, zastanawiam się, czy istnieje sposób na programowe uzyskanie szerokości.

Szukam czegoś na tyle ogólnego, aby pomieścić iPhone'a 3gs, iPhone'a 4, iPada. Ponadto szerokość powinna się zmieniać w zależności od tego, czy urządzenie jest ustawione pionowo czy poziomo (w przypadku iPada).

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

Shai UI
źródło
Czy szerokość ekranu, szerokość dostępnej przestrzeni aplikacji (bez paska systemowego) lub szerokość konkretnego widoku, którego szukasz?
VdesmedT,
hrmm nie jestem pewien. Chyba chciałem mieć tylko szerokość urządzenia (tj. w iPadzie 768 dla szerokości pionowej i 1024 dla szerokości w poziomie), ale self.view.bounds wydawało się to spełniać. zobacz mój komentarz poniżej
Shai UI
Zobacz tę bardziej wyczerpującą odpowiedź, która uwzględnia orientację urządzenia.
Drew Stephens
@DrewStephens Zobacz moją odpowiedź poniżej, która uwzględnia orientację i składa się tylko z 3 linii kodu: D.
memmons

Odpowiedzi:

204

Spójrz na UIScreen .

na przykład.

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

Spójrz na właściwość applicationFrame, jeśli nie chcesz dołączać paska stanu (nie wpłynie to na szerokość).

UPDATE: Okazuje się, że UIScreen (-bounds lub -applicationFrame) nie uwzględnia bieżącej orientacji interfejsu. Bardziej poprawnym podejściem byłoby poproszenie twojego UIView o jego granice - zakładając, że ten UIView został automatycznie obrócony przez jego kontroler widoku.

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

Jeśli widok nie jest automatycznie obracany przez kontroler widoku, będziesz musiał sprawdzić orientację interfejsu, aby określić, która część granic widoku reprezentuje „szerokość” i „wysokość”. Zauważ, że właściwość frame da ci prostokątny widok w przestrzeni współrzędnych UIWindow, który (domyślnie) nie będzie uwzględniał orientacji interfejsu.

Alan Rogers
źródło
3
w rzeczywistości to nie działa, gdy ipad jest zorientowany poziomo ... tzn. jeśli mój symulator działa w trybie poziomym, nadal zwraca 768 (zamiast 1024). czy myślisz, że powinienem mieć oświadczenie if, które sprawdza orientację w tym przypadku, czy jest lepszy sposób na uzyskanie szerokości?
Shai UI
Cholera - wygląda na to, że masz rację; Zaktualizowałem moją odpowiedź o więcej pomysłów.
Alan Rogers,
Skończyło się na tym, że użyłem „CGFloat width = CGRectGetWidth (self.view.bounds);” w mojej metodzie (nie ma potrzeby didRotateFromInterfaceOrientation) ... więc przynajmniej self.view.bounds bierze pod uwagę orientację. dzięki!!
Shai UI
5
dla innych, którzy mogli natknąć się na ten starszy post, stwierdziłem, że self.view.bounds jest całkowicie dokładne dopiero od początku didRotateFromInterfaceOrientation. Będzie również dokładny w viewDidLoad i viewWillAppear, jeśli widok jest wyświetlany w początkowej orientacji docelowej (jak określono w IB). Jeśli widok jest wyświetlany w innej orientacji niż docelowy, viewDidLoad (i viewWillAppear) jest wywoływany przed didRotateFromInterfaceOrientation, a view.bounds będą nieprawidłowe
rimsky
W przypadku iOS 6 i kiedy używamy kontrolerów modalnych, didRotateFromInterfaceOrientation nie zostanie wywołany
Krishnan
12
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
//Bonus height.
CGFloat height = CGRectGetHeight(screen);

źródło
10
nie uwzględnia orientacji
rimsky
6

Można to zrobić w 3 wierszach 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];
memmons
źródło
3
to jest blisko, ale jeśli wyświetlany jest UIAlertView, będzie to okno klucza, a jego właściwość
rootViewController
@mattbezark True. Uważam to jednak za przypadek narożny. Istnieje alternatywa, aby uzyskać widok roota - nie tak czysty jak ten, ale opublikuję alternatywę na wypadek, gdyby ktoś był zainteresowany.
memmons
@memmons trochę spóźniony na imprezę, ale byłbym zainteresowany Twoim alternatywnym rozwiązaniem :)
alexgophermix
0

Od wersji iOS 9.0 nie ma sposobu, aby wiarygodnie uzyskać orientację. Oto kod, którego użyłem do aplikacji, którą projektuję tylko w trybie pionowym, więc jeśli aplikacja zostanie otwarta w trybie poziomym, 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;
}
Konstabl
źródło
0

Użyj tego kodu, to pomoże

[[UIScreen mainScreen] bounds].size.height
[[UIScreen mainScreen] bounds].size.width
Shahzaib Maqbool
źródło
0

posługiwać się:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ;
Nacięcie
źródło
-2

Oto szybki sposób na uzyskanie rozmiarów ekranu, który uwzględnia również aktualną orientację interfejsu:

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 standardowa funkcja w:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
źródło