为什么self.view.frame和self.view.bounds在设备旋转时有所不同?

时间:2013-06-11 03:51:01

标签: ios uiview uiviewcontroller

我希望在设备旋转时进行一些布局更改。所以我实现- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration方法来完成工作。但我意识到这个方法被称为self.view.frame和self.view.bounds是不同的。 self.view.bounds.size是正确的,self.view.frame.size似乎仍然没有旋转。

例如,我创建了一个空的singleView项目并实现了如下方法:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    NSLog(@"willAnimateRotationToInterfaceOrientation");

    NSLog(@"self.view.bounds.size width:%f height:%f ",self.view.bounds.size.width,self.view.bounds.size.height);
    NSLog(@"self.view.frame.size width:%f height:%f",self.view.frame.size.width,self.view.frame.size.height);

}

当设备从纵向旋转到横向时。输出如下:

2013-06-11 11:57:46.959 viewDemo[95658:707] willAnimateRotationToInterfaceOrientation
2013-06-11 11:57:46.961 viewDemo[95658:707] self.view.bounds.size width:1024.000000 height:748.000000 
2013-06-11 11:57:46.961 viewDemo[95658:707] self.view.frame.size width:748.000000 height:1024.000000

我想知道为什么这些尺寸不同?它们不应该总是一样的吗?何时选择使用哪一个?

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:5)

查看截至目前已被接受的answer by "tc."。将答案中的几行复制到此处。

因此,“frame”相对于父视图,在本例中是UIWindow。旋转设备时,窗口不旋转;视图控制器的视图。从窗口的角度来看,一切都在纵向模式下有效。这就是为什么即使将设备旋转到横向后,self.view.frame也不会改变。

您应该使用self.view.bounds执行任何计算,因为它会为您提供与设备方向无关的正确值。

答案 1 :(得分:2)

我想知道为什么这些价值不同?它们不应该总是一样吗?
UIView的 界限 是矩形,表示为相对于其自身坐标系的位置(x,y)和大小(宽度,高度)(0 ,0)

UIView的 框架 是矩形,表示为相对于超级视图的位置(x,y)和大小(宽度,高度)包含在

在边界的情况下,x和y坐标为0,0,因为这些坐标是相对于视图本身的。但是,框架x和y坐标相对于父视图中视图的位置

何时选择使用哪一个?
希望这有助于澄清每个财产可能被使用的情况 UIView's frame, bounds, center, origin, when to use what?

答案 2 :(得分:0)

请注意,旋转模拟器时frame.size不等于bounds.size

参考此UIView frame, bounds and center

答案 3 :(得分:0)

使用方法确实(大小是新的)不会(大小与父控制器中的大小相同)

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];

    [halfView setFrame:CGRectMake(0, 0, self.view.bounds.size.width, 120)];
    NSLog(@"willAnimateRotationToInterfaceOrientation");
    NSLog(@"self.view.bounds.size width:%f height:%f ",self.view.bounds.size.width,self.view.bounds.size.height);
    NSLog(@"self.view.frame.size width:%f height:%f",self.view.frame.size.width,self.view.frame.size.height);

}