web-dev-qa-db-de.com

Wie erhalte ich die tatsächliche [UIScreen mainScreen] -Frame-Größe?

Ich bin ein bisschen genervt. Ich habe eine App mit der Statusleiste im Hauptfenster. Da ich meine Ansichten und deren Framegrößen dynamisch einrichten möchte (vielleicht nimmt die Statusleiste während eines Telefonats zum Beispiel 40 Pixel ein).

Ich kann eines der beiden machen:

[[UIScreen mainScreen] bounds];
[[UIScreen mainScreen] applicationFrame];

Das wirklich ärgerliche daran ist, dass diese beiden zwei unterschiedliche Wertesätze ausgeben, die alle gleichermaßen unbrauchbar sind.

bounds gibt aus: {{0, 0}, {320, 480}} while
applicationFrame gibt {{0, 20}, {320, 460}}

Wie Sie sehen können, gibt bounds den richtigen y-Ursprung an (0 beginnt rechts unterhalb der Statusleiste), gibt dann aber eine Höhe von 480 an, was falsch ist. Es sollte 460 sein, da die Statusleiste sichtbar ist. Dann haben wir applicationFrame, das 20 Pixel unterhalb der Statusleiste beginnt (es gibt also eine Obergrenze), aber dann die richtige Höhe angibt. Aber das ist nicht sehr nützlich, wenn es dann ohnehin 20 Pixel runtergeschoben wird.

Irgendeine Hilfe?

48
runmad

Eigentlich ist das sehr nützlich.
Wenn Sie ein UIScreen nach dem Bounds fragen, erhalten Sie die Grenzen des Bildschirms, der den gesamten Bildschirm des Geräts darstellt. (Die Statusleiste ist Teil des Bildschirms)
Wenn Sie jedoch ein UIScreen fragen, wo und wie groß die Stammansicht Ihrer Anwendung sein kann, ist es nützlich, nach dem applicationFrame zu fragen. Es gibt keine direkte Beziehung zwischen den beiden Aufrufen, außer dass das applicationFrame im Koordinatensystem UIScreen bounds Zurückgegeben wird. (Aber die Statusleiste ist nicht Teil Ihrer Anwendung, die das unterschiedliche Ergebnis erklärt.)

applicationFrame
Das Rahmenrechteck, das für das Fenster Ihrer Anwendung verwendet werden soll. (schreibgeschützt)
@ property (nichtatomar, schreibgeschützt) CGRect applicationFrame
Diskussion
Diese Eigenschaft enthält die Bildschirmgrenzen abzüglich des Bereichs, der von der Statusleiste belegt wird, sofern dieser sichtbar ist. Die Verwendung dieser Eigenschaft ist die empfohlene Methode, um die ursprüngliche Fenstergröße Ihrer Anwendung abzurufen. Das Rechteck wird in Punkten angegeben.

50
Vincent Bernier

Tatsächlich beginnt 0 nicht am unteren Rand der Statusleiste. Es beginnt ganz oben. Fügen Sie ein UILabel bei (0,0) hinzu, und Sie werden es erst sehen, wenn Sie die Statusleiste ausgeblendet haben. Grenzen geben Ihnen also den gesamten Bildschirmbereich und ApplicationFrame den Bereich, mit dem Ihre Anwendung arbeiten muss. Ich wette, wenn Sie die Statusleiste ausblenden, entspricht der Anwendungsrahmen den Grenzen.

8
tupakapoor

Ich hatte ein ähnliches Problem. Was ich tat, war ziemlich dumm, aber ich hoffe, das hilft jemandem.

In der Unteransicht hatte ich:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        UIView * otherSubview = [[UIView alloc] initWithFrame:frame];
        [self addSubview:otherSubview];
    }
    return self;
}

Da ich meine Unteransicht mit einem Frame mit Origin not at (0,0) erstellt habe, aber dann denselben Frame zum Generieren von Unteransichten für meine Unteransicht verwendet habe, wurden diese Unteransichten ebenfalls nach unten verschoben. Das Ergebnis war das nervige schwarze Banner, das Sie erwähnt haben.

Ich habe das folgendermaßen behoben:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        CGRect rect = frame;
        rect.Origin.x = 0;
        rect.Origin.y = 0;
        UIView * otherSubview = [[UIView alloc] initWithFrame:rect];
        [self addSubview:otherSubview];
    }
    return self;
}
1
LDY

Swift 2.0 Update:

func presentAboveAll() {
       //Get the view from the nib. Assuming the view is is in AboveAllView.xib
        let nibContents = NSBundle.mainBundle().loadNibNamed("AboveAllView", owner: nil, options: nil)

        //Get hold of your view
        let views =  nibContents.filter {
          if let _ = $0 as? UIView{
            return true
          }
          return false
        }

        guard views.count > 0  else {
          return
        }

        //Set up frame and add to the app's key window
        let view  = views.first as! UIView
        view.frame = UIScreen.mainScreen().bounds
        UIApplication.sharedApplication().keyWindow?.addSubview(view)
}
0
Shripada

Vielleicht sehen Sie sich UIWindow an. Es erbt von UIView, hat also Begrenzungen und einen Rahmen, und iOS-Apps sind alle ein einziges Fenster. - [UIApplication keyWindow] gibt das vom App-Delegaten eingerichtete Fenster zurück. Da alle anderen Ansichten im Hauptfenster verankert sind, stelle ich mir vor, dass dies Ihnen die richtigen Grenzen setzen sollte.

0
pzearfoss