我希望在设备旋转时进行一些布局更改。所以我实现- (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
我想知道为什么这些尺寸不同?它们不应该总是一样的吗?何时选择使用哪一个?
任何帮助将不胜感激。
答案 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
答案 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);
}