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, toInterfaceOrientationda die statusBarOrientation der UIApplication weiterhin auf die alte Ausrichtung verweist, da sie sich noch nicht geändert hat (da Sie sich in einem willEreignishandler 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- rootViewControllerEigenschaft 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!