iPhone 重新旋转后,帧或窗口大小不正确。

39
在我的iPhone应用程序中,我希望(需要)监视设备方向的变化,以重新排列屏幕上的某些部分。我使用的方法是使用CGRect frame = [UIScreen mainScreen].applicationFrame获取屏幕大小,然后计算其他控件的大小和/或定位(我也尝试过self.view.frame)。
到目前为止,所有测试都是在纵向模式下进行的,所以我可以专注于编程主要功能,稍后只需进行一些横向调整即可。这里出现了问题:-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation中,我添加了一些日志记录来检查大小,但显然宽度和高度的值是“错误”的(我说“错误”是因为初看这些值对我来说似乎不合理)。
以下是一些记录输出:
  • Rotation: Landscape [w=300.000000, h=480.000000]
  • Rotation: Portrait [w=320.000000, h=460.000000]
我觉得横向模式下“w”和“h”的值是颠倒的-我期望w=480,h=300。
我做错了什么?我用于调试的代码如下。
-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    CGSize size = frame.size;

    NSLog(@"%@", [NSString stringWithFormat:@"Rotation: %s [w=%f, h=%f]",  
        UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? "Portrait" : "Landscape",
        size.width, size.height]);
}

嗯嗯...如果我使用self.view.bounds(考虑到“self.view”是主视图,其他子视图将被添加以组成应用程序),我会得到预期的值。现在我想起了斯坦福iPhone Dev课程中在iTues U上讨论过的某些内容,但我不确定它是否相关。无论如何,我仍然希望得到更具体的意见。 - Rafael Steil
同样令人好奇的是,如果您有一个导航控制器,self.view.frame 就可以正常工作,但如果没有,看起来您必须使用 self.view.bounds - Rob
3个回答

33

你的设备方向改变了,但屏幕的物理特性并没有改变。实际上,你只是把它倾斜了,但它的宽度仍然是320像素(其中20像素因为状态栏的显示而不可用),高度为480像素。如果你的视图自动旋转,那么宽度/高度已经被转换了,但当你请求屏幕的实际尺寸时,你会得到屏幕的实际尺寸。

这也是在使用翻译视图时,基于视图的中心和边界进行计算非常重要的原因,而不是基于视图的框架。


4
自动旋转的视图转换并不会影响视图的框架(frame),您能否解释更多或提供相关的链接来说明这个原理?我感到有些困惑。谢谢。 - user1705636

26

请使用 self.view.bounds 替代。


小心使用这个。如果当前视图的大小正是您想要的,那么它非常好,但它不能替代[UIScreen mainScreen].applicationFrame,因为它没有考虑状态栏的高度。 - Axeva
仍然是错误的值。宽度和高度是错误的。必须翻转过来。 - openfrog
这对我在iOS 7上有效,它在willAnimateRotationToInterfaceOrientation中提供了正确的新尺寸。 - malhal
1
这就是诀窍。浪费了三个小时使用view.frame而不是view.bound。谢谢! - doxsi

18

我一直在遇到同样的问题,在进行了一些诊断工作后,我发现在 viewDidLoad 中(当设备在将视图控制器推入堆栈时处于横向模式)视图的边界和框架并不准确反映横向方向,但在 viewWillAppear:viewDidAppear: 中则正确地进行了反映。我只需将需要框架/边界尺寸的代码从 viewDidLoad 移动到 viewWillAppear: 中即可使其正常工作。


我有可以解决这个问题的可用代码,链接在此:如何获取屏幕方向相关的高度和宽度?。也许你已经解决了这个问题,但如果还没有,希望这能对你有所帮助。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接