0

因此,为了处理方向变化(在视图中,而不是控制器中),我们注册了 UIDeviceOrientationDidChange 通知。都好。

它在应用程序启动时被调用,报告正确的尺寸,但错误地表示发生了某些变化(由于具有横向视图或其他软件原因,这可能会被触发)。

在几条不必要的消息之后,它将开始发送合法消息。设备将报告正确的“到”方向,但仍会给出当前帧(和边界),这是无效的。

要将页面向右滚动,其他 SO 问题让我记得手动设置 contentOffset,它有我需要的大部分内容。currentPage = 当前 Y 偏移量/滚动视图的宽度。基础数学,不错

这解决了我的大部分问题。对于正确的 OO,我为滚动视图提供了一个重新布局功能,它不是 iPad 的大小,因为它是一个子视图,并且在其中我这样做:

float currentDeviceWidth = 768;
float currentHeight = 949; //logging the frame from portrait, landscape = 1024 w, 693 h
UIDeviceOrientation o = [[UIDevice currentDevice] orientation];
if (!UIDeviceOrientationIsPortrait(o)) {
    //landscape
    currentDeviceWidth = 1024;
    currentHeight = 693;
}
else
    NSLog(@"Moving to port, unless on startup, then its staying as");

它处理orientationDidChange:消息,但是当应用程序启动时,滚动视图现在比它应该的要小,因为它设置它的大小就好像它得到的边界是“即将改变”,而实际上它们不是。

可能的解决方案: a) [self performSelector:@selector(relayout) withObject:nil afterDelay:delayNum];

b)在设置/取消设置诸如“BOOL dontIgnoreLayout”之类的内容之前给出时间延迟

c) 寻找另一种测试方向的方法

d)手动进入并找出导致所有消息最初发送的原因,删除所有原因 - 此选项仅在系统启动时未创建时才可用。我可以在几秒钟内用一个新项目来测试它,虽然它是一个企业应用程序,如果是这样的话可能需要一些时间。

想知道有没有人解决这个问题。如果没有,我必须输入“特殊情况”或“基于时间”的代码,它们都不是 OO 风格,至少不是我喜欢的方式(也不是我的同事)。

如果我错过了 SO,请告诉我,但如您所见,到目前为止,我已经找到了一些答案。

谢谢

4

1 回答 1

0

我通过测试状态栏方向来遵循其他人的示例,它似乎总是正确的,并且显示与 UIDevice currentOrientation 冲突的消息......我知道这已经被发现,但解决问题的具体原因是:

根据其他线程的建议,我在 ViewDidAppear 而不是 viewDidLoad 中注册了通知,这种组合似乎是胜利。

于 2012-05-15T17:34:38.930 回答