为什么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
显示导航栏时 viewWillAppear 中的正确 self.view.frame