在iOS上,为什么视图框架的高度在旋转后几乎保持不变?

时间:2012-05-23 05:08:42

标签: iphone ios ipad uiview uiviewcontroller

在iPad上的ViewController.m ,如果我们在点击事件处理程序中打印出视图的帧高:

NSLog(@"Height of main view is %f", self.view.frame.size.height);

然后在纵向模式下,值为1004(设备状态行为20像素,因此1024 - 20 = 1004),如果设备旋转到横向模式,我预计它大约是768或748,但是打印的值实际上是1024. (更新:如果应用程序在横向模式下启动,然后没有旋转,它也打印为1024)。为什么会这样,并且有一个经验法则是期望获得748或768的价值? (有多种方法可以实现吗?)

3 个答案:

答案 0 :(得分:4)

在Apple的文档中,关于UIView的框架:

  

警告:如果transform属性不是identity变换,那么   此属性的值未定义,因此应忽略。

所以你应该使用 bounds 属性。

答案 1 :(得分:1)

您可以编程方式管理方向,并覆盖willRotateToInterfaceOrientation方法。见道:

#define IPAD_SIZE_PORTRAIT          CGSizeMake(768, 960)
#define IPAD_SIZE_LANDSCAPE         CGSizeMake(1024, 704)

-(void)relayoutSubviews:(UIInterfaceOrientation)orientation
{
CGSize  scrSize;

if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight))
{
    scrSize = IPAD_SIZE_LANDSCAPE;
}
else
{
    scrSize = IPAD_SIZE_PORTRAIT;
}

self.view.bounds = CGRectMake(0, 0, scrSize.width, scrSize.height);
self.view.frame = CGRectMake(0, 0, scrSize.width, scrSize.height);
}

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[self relayoutSubviews:toInterfaceOrientation];
}

答案 2 :(得分:0)

这背后的原因是当您旋转设备时,视图的框架会更改以适应状态栏,但实际上不会旋转视图的框架。设备只是将视图渲染为旋转状态,而视图实际上未旋转。我认为子视图会受到此更改的影响,但整体视图不会。