Frage

Probleme, die richtigen Grenzen für meine iPad-Anwendung bekommen, wenn es im Landschaftsmodus zu starten. Ich habe die richtigen Tasten gesetzt in meiner Info.plist-Datei, und meine Ansicht-Controller starten richtig in Landschaft (und Porträt, natch).

In meinem applicationDidFinishLaunching: Methode Ich bin ein Wähler nach einer Verzögerung von 3 Sekunden aufrufen, und diese Methode macht einen Aufruf an [[UIScreen mainScreen] applicationFrame], aber es ist mir eine Rückkehr Porträtrahmen (dh Höhe> Breite).

Wer weiß, wie dieses Problem beheben? Es riecht wie ein Bug zu mir (wenn also werde ich ein Radar-Datei), aber wenn es bestimmt Verhalten, wo ist es dokumentiert?

War es hilfreich?

Lösung

Wenn Sie das iPad im Querformat halten und eine App starten, der View-Controller sieht zunächst Grenzen für eine Portraitansicht (obwohl Orientierung Berichte Landschaft). Der View-Controller wird dann erhalten Sie eine Nachricht zu drehen, um Querformat, bevor es angezeigt wird.

Andere Tipps

Ich verlasse mich nie auf [[UIScreen mainScreen] applicationFrame], vor allem während der App-Start.

Wenn Ansichten in Code erstellen, verwenden Sie die Superview Ihren Rahmen zu setzen.

Wenn Sie xibs mit „simuliert Interface-Elemente“ können sie die richtige Größe und alles wird funktionieren groß.

UINavigationController basierte Anwendungen

Im Falle einer UINavigationController basierte Anwendung, greifen den Rahmen direkt von self.navigationController.view, versuchen Sie nicht [self loadView] und self.view.superview zu verwenden. UINavigationController verwendet „versteckt“ Subviews seinen Job zu tun - so die direkte Superview wird nicht funktionieren

.

ist UINavigationController etwas Besonderes, weil während der App-Start, die Navigationssteuerung Ihre Ansichten ändert die Größe nach loadView aufgerufen wird. Wenn Tritte in der automatischen Größen Sie enden am unteren Rand des Bildschirms mit einer kleinen Marge.

Warum nicht UIScreen

[[UIScreen mainScreen] applicationFrame] funktioniert nicht zuverlässig (vor allem während der App-Start in der Landschaft). Meine Erfahrung ist, dass das interfaceOrientation Eigenschaft Viewcontroller wird die applicationFrame Orientierung nicht überein.

CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
    bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
}

Das ist die Art, wie ich die richtige CGRect erhalten, wenn die View-Controller auf Landschaft ist:

CGRect landscapeBounds;
if (self.view.frame.size.width < self.view.frame.size.height)
    landscapeBounds = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width);
else
    landscapeBounds = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);

Dies ist so vorgesehen. Sie sollten die Größe des Superview und bei Bedarf nachjustieren abfragen.

[[UIScreen mainScreen] applicationFrame] wird immer das Porträt Rechteck zurück, auch wenn die App im Querformat ist. Dies bezieht sich auf die Tatsache, dass UIWindow nie tatsächlich dreht, sondern ändert nur die statt rootViewController.view zu verwandeln.

Um sicher zu machen, können Sie das Root-View-Objekt in Hoch- und Querformat drucken, und Sie werden etwas sehen:

Portrait:

<UIView: 0x96290e0; frame = (0 20; 768 1004); ...

Landschaft:

<UIView: 0x96290e0; frame = (0 20; 768 1004); transform = [0, 1, -1, 0, 0, 0]; ...

So fügen Sie ein Startbild und gibt ihm das Suffix -568h, nach Apples Führern.

Ich verstehe nicht, warum jemand mit einem gesunden Geist eine Systemeinstellung auf einer Grafik abhängig machen würde; aber ich gerade getestet und es hat funktioniert.

Hier ist der Punkt, der mich nach einer kurzen Suche gelehrt ich nicht diese Antwort oben gesehen hat, dachte, es jemandem nützlich sein würde.

S

Ich habe in gleiches Problem, wenn Ansicht mit dismissViewControllerAnimated in Cordova Plugin entlassen. Ich modifizierte singingAtom Code für viewWillAppear Verfahren in Mainviewcontroller, die nach Entlassung modale Ansicht der Größe verändert wurde:

- (void)viewWillAppear:(BOOL)animated
    {
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIDeviceOrientationLandscapeLeft == orientation || 
        UIDeviceOrientationLandscapeRight == orientation)
            {
            if (appFrame.size.width < appFrame.size.height)
                {
                appFrame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width);
                }
        }
    self.view.frame = appFrame;
    [super viewWillAppear:animated];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top