Sie können so etwas wie UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)
die Ausrichtung bestimmen und dann die Abmessungen entsprechend verwenden.
JEDOCH während einer Orientierungsänderung wie bei UIViewController
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
Verwenden Sie die übergebene Ausrichtung, toInterfaceOrientation
da die statusBarOrientation der UIApplication weiterhin auf die alte Ausrichtung verweist, da sie sich noch nicht geändert hat (da Sie sich in einem will
Ereignishandler befinden).
Zusammenfassung
Es gibt mehrere verwandte Beiträge dazu, aber jeder von ihnen scheint darauf hinzudeuten, dass Sie:
- Schauen Sie
[[UIScreen mainScreen] bounds]
sich die Maße an,
- Überprüfen Sie, in welcher Ausrichtung Sie sich befinden, und
- Berücksichtigen Sie die Höhe der Statusleiste (falls angezeigt).
Links
Arbeitscode
Normalerweise gehe ich nicht so weit, aber Sie haben mein Interesse geweckt. Der folgende Code sollte den Trick machen. Ich habe eine Kategorie über UIApplication geschrieben. Ich habe Klassenmethoden hinzugefügt, um die aktuelle Größe oder die Größe in einer bestimmten Ausrichtung zu erhalten willRotateToInterfaceOrientation:duration:
. Dies würden Sie in UIViewController aufrufen .
@interface UIApplication (AppDimensions)
+(CGSize) currentSize;
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation;
@end
@implementation UIApplication (AppDimensions)
+(CGSize) currentSize
{
return [UIApplication sizeInOrientation:[UIApplication sharedApplication].statusBarOrientation];
}
+(CGSize) sizeInOrientation:(UIInterfaceOrientation)orientation
{
CGSize size = [UIScreen mainScreen].bounds.size;
UIApplication *application = [UIApplication sharedApplication];
if (UIInterfaceOrientationIsLandscape(orientation))
{
size = CGSizeMake(size.height, size.width);
}
if (application.statusBarHidden == NO)
{
size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
}
return size;
}
@end
Um den Code zu verwenden, rufen Sie einfach auf [UIApplication currentSize]
. Außerdem habe ich den obigen Code ausgeführt, damit ich weiß, dass er funktioniert, und die richtigen Antworten in allen Ausrichtungen zurückgemeldet. Beachten Sie, dass ich die Statusleiste berücksichtige. Interessanterweise musste ich den MIN von der Höhe und Breite der Statusleiste abziehen.
Hoffe das hilft. : D.
Andere Gedanken
Sie können die Abmessungen ermitteln, indem Sie sich die UIWindow- rootViewController
Eigenschaft ansehen . Ich habe mir das in der Vergangenheit angesehen und es werden auf ähnliche Weise sowohl im Hoch- als auch im Querformat die gleichen Abmessungen angezeigt, außer dass eine Rotationstransformation gemeldet wird:
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] view]
<UILayoutContainerView: 0xf7296f0; Rahmen = (0 0; 320 480); transform = [0, -1, 1, 0, 0, 0]; Autoresize = W + H; Layer = <CALayer: 0xf729b80 >>
(gdb) po [[[[UIApplication sharedApplication] keyWindow] rootViewController] view]
<UILayoutContainerView: 0xf7296f0; Rahmen = (0 0; 320 480); Autoresize = W + H; Layer = <CALayer: 0xf729b80 >>
Sie sind sich nicht sicher, wie Ihre App funktioniert, aber wenn Sie keinen Navigationscontroller verwenden, können Sie unter Ihrer Hauptansicht eine UIView mit der maximalen Höhe / Breite des übergeordneten Elements haben und mit dem übergeordneten Element wachsen / schrumpfen. Dann könnten Sie tun:[[[[[[[UIApplication sharedApplication] keyWindow] rootViewController] view] subviews] objectAtIndex:0] frame]
. Das sieht in einer Zeile ziemlich intensiv aus, aber man kommt auf die Idee.
Allerdings ... Es wäre immer noch besser, die obigen 3 Schritte unter der Zusammenfassung auszuführen. Wenn Sie anfangen, mit UIWindows herumzuspielen, werden Sie seltsame Dinge herausfinden, wie das Anzeigen einer UIAlertView, die das Schlüsselfenster von UIApplication so ändert, dass es auf ein neues UIWindow zeigt, das von UIAlertView erstellt wurde. Wer wusste? Ich habe es getan, nachdem ich einen Fehler gefunden hatte, der sich auf keyWindow stützte und herausfand, dass es sich so geändert hatte!
applicationFrame
anstelle vonbounds
(auf UIScreen) verwenden, müssen Sie die Höhe der Statusleiste nicht subtrahieren.mainScreen().bounds.size
ist ab iOS 8 orientierungsabhängig gewordenDies ist mein Lösungscode! Diese Methode kann zur Kategorie Categroy der NSObject-Klasse hinzugefügt werden, oder Sie können eine benutzerdefinierte Top-UIViewController-Klasse definieren und alle Ihre anderen UIViewController diese erben lassen.
Beachten Sie nach IOS8, wie in der Eigenschaft "Bound" von Apple Document of UIScreen angegeben :
Aus Gründen der Kompatibilität sollten wir daher die IOS-Version erkennen und die folgenden Änderungen vornehmen:
quelle
Hier ist ein praktisches Makro:
quelle
In iOS 8+ sollten Sie die folgende
viewWillTransitionToSize:withTransitionCoordinator
Methode verwenden:Dies ersetzt die veraltete Animationsmethode, die keine Informationen zur Größe lieferte:
quelle
Ab iOS 8 werden die Bildschirmgrenzen jetzt korrekt für die aktuelle Ausrichtung zurückgegeben. Dies bedeutet, dass ein iPad im Querformat [UIScreen mainScreen] .bounds unter iOS <= 7 768 und unter iOS 8 1024 zurückgeben würde.
Im Folgenden wird die korrekte Höhe und Breite für alle freigegebenen Versionen zurückgegeben.
quelle
Wenn Sie die orientierungsabhängige Größe wünschen und eine Ansicht haben, können Sie einfach Folgendes verwenden:
quelle
Ich habe eine Kategorie für geschrieben
UIScreen
, die auf allen iOS-Versionen funktioniert, sodass Sie sie folgendermaßen verwenden können :[[UIScreen mainScreen] currentScreenSize]
.quelle
Hier ist ein schneller Weg, um orientierungsabhängige Bildschirmgrößen zu erhalten:
Diese sind als Standardfunktion in einem meiner Projekte enthalten:
https://github.com/goktugyil/EZSwiftExtensions
quelle
quelle
Unter iOS 8.0.2:
quelle
Verwenden Sie -> setNeedsDisplay () für die Ansicht, deren Größe Sie ändern möchten.
quelle