Nach der rotation UIView-Koordinaten vertauscht werden, aber UIWindow nicht?
Mithilfe von Xcode 4.2.1 iPad iOS 5.0.1 erstellen Sie eine neue "Single View" iPad-Projekt. Im controller hinzufügen:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
- (void) dumpView: (UIView *) view {
CGRect frame = view.frame ;
CGRect bounds = view.bounds ;
CGPoint center = view.center ;
NSLog(@"view [%@]:%d frame=%@ bounds=%@ center=%@"
, NSStringFromClass(view.class)
, [view hash]
, NSStringFromCGRect(frame)
, NSStringFromCGRect(bounds)
, NSStringFromCGPoint(center)) ;
}
- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation) fromInterfaceOrientation {
NSLog(@"INViewController.didRotateFromInterfaceOrientation: %d to %d", fromInterfaceOrientation, self.interfaceOrientation) ;
[self dumpView: self.view] ;
[self dumpView: self.view.superview] ;
}
Führen Sie es, drehen Sie das Gerät und Sie erhalten:
INViewController.didRotateFromInterfaceOrientation: 2 to 4
view [UIView] bounds={{0, 0}, {1024, 748}} center={394, 512}
view [UIWindow] bounds={{0, 0}, {768, 1024}} center={384, 512}
In anderen Worten, die UIView hat seine Koordinaten "ausgelagert Landschaft" als erwartet, aber seine Eltern UIWindow noch Forderungen werden im portrait-Modus...
Auch, die UIView Größe scheint ein bisschen falsch: die y-Koordinate, die sollten in 20 bei 0 ...
Jemand weiß, was das bedeutet?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem UIWindow Koordinatensystem ist immer im hochformat. Es gilt die Drehung durch setzen der rootViewController-Ansicht transformieren. Zum Beispiel habe ich eine test-app, die single-view-template und es lief. Im hochformat:
Drehen nach Links:
Drehen nach rechts:
Beachten Sie, wie die Transformation festgelegt ist (bis zu einem 90-Grad-Drehung, die matrix), wenn das Gerät gedreht wird.
Bezüglich Ihrer Frage über die UIView Größe: eine Ansicht, die Grenzen sind im eigenen Koordinatenraum und durch einen Standard-view bounds " origin ist der Ursprung (0,0) des Koordinatenraums. Eine Ansicht, die frame ist im übergeordneten Koordinatenraum. Sie können sehen, die 20, die Sie erwartet in den rekursiven Beschreibungen oben, oder durch den Druck des Rahmens direkt:
frame
in meinem code, wenntransform
ist nicht die Identität. Jedoch, dieframe
Methode erscheint immer wieder[self convertRect:self.bounds toView:self.superview]
und so ist es nützlich, beim Debuggen.