IPhone / IPad: Wie erhalte ich die Bildschirmbreite programmgesteuert?

83

Hallo, ich frage mich, ob es eine Möglichkeit gibt, die Breite programmgesteuert zu ermitteln.

Ich bin auf der Suche nach etwas Allgemeinem genug, um iPhone 3Gs, iPhone 4, iPad unterzubringen. Außerdem sollte sich die Breite ändern, je nachdem, ob es sich bei dem Gerät um ein Hoch- oder Querformat handelt (für ein iPad).

Weiß jemand wie man das macht ?? Ich habe eine Weile gesucht ... danke!

foreyez
quelle
Ist die Breite des Bildschirms, die Breite des verfügbaren Anwendungsbereichs (ohne Systemleiste) oder die Breite einer bestimmten Ansicht, die Sie suchen?
VdesmedT
hmmm ich bin mir nicht sicher Ich glaube, ich wollte nur die Breite des Geräts (dh im iPad 768 für die Porträtbreite und 1024 für die Querformatbreite), aber self.view.bounds schien dies zu befriedigen. siehe meinen Kommentar unten
foreyez
Sehen Sie sich diese umfassendere Antwort an , die die Ausrichtung des Geräts berücksichtigt.
Drew Stephens
@DrewStephens Siehe meine Antwort unten, die die Ausrichtung berücksichtigt und nur aus 3 Codezeilen besteht: D.
Memmons

Antworten:

204

Schauen Sie sich UIScreen an .

z.B.

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

Sehen Sie sich die applicationFrame-Eigenschaft an, wenn die Statusleiste nicht enthalten sein soll (die Breite wird nicht beeinflusst).

UPDATE: Es stellt sich heraus, dass UIScreen (-bounds oder -applicationFrame) die aktuelle Ausrichtung der Benutzeroberfläche nicht berücksichtigt. Ein korrekterer Ansatz wäre, Ihr UIView nach seinen Grenzen zu fragen - vorausgesetzt, dieses UIView wurde von seinem View-Controller automatisch gedreht.

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

Wenn die Ansicht vom View Controller nicht automatisch gedreht wird, müssen Sie die Ausrichtung der Benutzeroberfläche überprüfen, um festzustellen, welcher Teil der Ansichtsgrenzen die 'Breite' und die 'Höhe' darstellt. Beachten Sie, dass die Rahmeneigenschaft das Rechteck der Ansicht im Koordinatenraum des UIWindow anzeigt, wobei (standardmäßig) die Ausrichtung der Benutzeroberfläche nicht berücksichtigt wird.

Alan Rogers
quelle
3
Tatsächlich funktioniert dies nicht, wenn das iPad auf Querformat ausgerichtet ist. Wenn auf meinem Simulator also Querformat ausgeführt wird, wird immer noch 768 (anstelle von 1024) zurückgegeben. Denkst du, ich sollte eine if-Anweisung haben, die in diesem Fall die Ausrichtung überprüft, oder gibt es einen besseren Weg, um die Breite zu ermitteln?
Foreyez
Verdammt - sieht so aus, als ob du richtig bist; Ich habe meine Antwort mit weiteren Ideen aktualisiert.
Alan Rogers
Am Ende habe ich nur "CGFloat width = CGRectGetWidth (self.view.bounds)" verwendet. in meiner Methode (keine Notwendigkeit für didRotateFromInterfaceOrientation) ... berücksichtigt also zumindest self.view.bounds die Ausrichtung. Vielen Dank!!
Foreyez
5
Für andere, die möglicherweise auf diesen älteren Beitrag gestoßen sind, habe ich festgestellt, dass self.view.bounds nur ab didRotateFromInterfaceOrientation völlig korrekt ist. Es ist auch in viewDidLoad und viewWillAppear genau, wenn die Ansicht in ihrer ursprünglichen Zielausrichtung angezeigt wird (wie in IB angegeben). Wenn die Ansicht in einer anderen Ausrichtung als dem Ziel angezeigt wird, wird viewDidLoad (und viewWillAppear) aufgerufen, bevor didRotateFromInterfaceOrientation und view.bounds falsch sind
rimsky
Im Fall von iOS 6 und wenn wir Modal-Controller verwenden, wird die didRotateFromInterfaceOrientation nicht aufgerufen
Krishnan
11
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
//Bonus height.
CGFloat height = CGRectGetHeight(screen);

quelle
10
berücksichtigt nicht die Orientierung
rimsky
6

Dies kann in 3 Codezeilen erfolgen :

// 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
quelle
3
Dies ist nah, aber wenn ein UIAlertView angezeigt wird, ist es das Schlüsselfenster und seine rootViewController-Eigenschaft ist null
matt bezark
@ Mattbezark True. Ich halte das allerdings für einen Eckfall. Es gibt eine Alternative, um die Root-Ansicht zu erhalten - nicht so sauber wie diese, aber ich werde die Alternative veröffentlichen, falls jemand interessiert ist.
Memmons
@memmons ein wenig zu spät zur Party, aber ich würde mich für Ihre alternative Lösung interessieren :)
Alexgophermix
0

Ab iOS 9.0 gibt es keine Möglichkeit, die Ausrichtung zuverlässig zu erhalten. Dies ist der Code, den ich für eine App verwendet habe, die ich nur für den Hochformatmodus entwerfe. Wenn die App also im Querformat geöffnet wird, ist sie immer noch korrekt:

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

Verwenden Sie diesen Code, es wird helfen

[[UIScreen mainScreen] bounds].size.height
[[UIScreen mainScreen] bounds].size.width
Shahzaib Maqbool
quelle
0

verwenden:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ;
Nick
quelle
-2

Hier ist ein schneller Weg, um Bildschirmgrößen zu erhalten. Dies berücksichtigt auch die aktuelle Ausrichtung der Benutzeroberfläche:

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
}

Diese sind standardmäßig enthalten in:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
quelle