由项目模板基于视图的应用程序生成的简单iphone程序,带有几个按钮,我添加了以下代码:
- (void) showInfo: (UIView *) view {
NSLog(@"view bounds %6.2f %6.2f %6.2f %6.2f", view.bounds.origin.x, view.bounds.origin.y, view.bounds.size.width, view.bounds.size.height);
NSLog(@"view frame %6.2f %6.2f %6.2f %6.2f", view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
NSLog(@"view center %6.2f %6.2f", view.center.x, view.center.y);
}
- (BOOL)shouldAutorotateToInterfaceOrientation: UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
- (void)willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration:(NSTimeInterval) duration {
switch(toInterfaceOrientation) {
case UIInterfaceOrientationPortrait:
[self showInfo: self.view];
break;
case UIInterfaceOrientationLandscapeLeft:
[self showInfo: self.view];
break;
case UIInterfaceOrientationLandscapeRight:
[self showInfo: self.view];
break;
}
}
- (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation {
switch(fromInterfaceOrientation) {
case UIInterfaceOrientationPortrait:
[self showInfo: self.view];
break;
case UIInterfaceOrientationLandscapeLeft:
[self showInfo: self.view];
break;
case UIInterfaceOrientationLandscapeRight:
[self showInfo: self.view];
break;
}
}
在纵向中启动模拟器,更改为横向右侧。我可以得到:
查看边界0.00 0.00 320.00 460.00
查看框架0.00 20.00 320.00 460.00
查看中心160.00 250.00
在纵向中,视图的大小为320x460,由于状态栏,它的原点是(0,20)。
view bounds 0.00 0.00 480.00 300.00
查看框架0.00 0.00 300.00 480.00
查看中心150.00 240.00
在横向右侧,边界的大小更改为480x300,但帧的原点是(0,0)。框架的大小与边界不同。
在我的脑海中,我想这些坐标如下图所示:
我的问题是:在横向右侧,似乎框架的原点指向一个位置,而边界的原点指向另一个位置。所以我认为视图控制器中的某个位置会发生一些旋转。它在哪里以及它做了什么?
感谢您阅读这个长期且不那么明确的问题。 :)
答案 0 :(得分:7)
在横向模式下,“内容视图”(controller.view
)将调整大小并应用90度的变换。
由于bounds
表示内部坐标系中的边界矩形,bounds.origin
将始终位于视图本身的左上角。
但是,frame
是外部或父级坐标系中的边界矩形。视图的父级是窗口,它仍然具有设备绝对左上角的原点。因此,frame.origin
处于横向模式的该位置。