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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么self.view.frame和self.view.bounds在设备旋转时有所不同?相关的知识,希望对你有一定的参考价值。

我希望在设备旋转时进行一些布局更改。所以我实现了- (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

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

任何帮助将不胜感激。

答案

看看现在接受的answer by "tc."。将答案中的几行复制到此处。

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

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

另一答案

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

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

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

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

另一答案

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

请参考这一个UIView frame, bounds and center

另一答案

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

- (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);

}

以上是关于为什么self.view.frame和self.view.bounds在设备旋转时有所不同?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 状态栏和 self.view.frame 和 self.view.bounds

self.view.frame.size 在同一方向改变值

self.view.frame 在横向模式下意外更改大小

显示导航栏时 viewWillAppear 中的正确 self.view.frame

iOS - self.view.frame.size.width 为 0.00000

使用 self.view.frame 时 UIImageView initWithFrame 大小不正确