在应用程序启动时处理带有方向的 UIScrollView 分页时如何避免"special Case"



因此,为了处理方向更改(在视图中,而不是在控制器中(,我们使用UIDeviceOrientationDidChange通知进行注册。都很好。

它在应用启动时被调用,报告正确的尺寸,但错误地说出某些更改(由于具有横向视图或其他软件原因,这可能会被触发(。

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

要将页面向右滚动,其他 SO 问题导致我记得手动设置 contentOffset,其中包含我需要的大部分内容。 当前页面 = 当前 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");

它处理方向DidChange:消息,但是当应用程序启动时,滚动视图现在比应有的小,因为它设置了它的大小,就好像它得到的边界"即将改变",而实际上并非如此。

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

b( 在设置/取消设置"BOOL dontIgnoreLayout"之前给出一个时间延迟

c( 找到另一种方法来测试方向

d( 手动进入并找出导致最初发送所有消息的原因,删除所有原因 - 此选项仅在启动时不是由系统创建的时才可用。我可以在一秒钟内用一个新项目对此进行测试,尽管它是一个企业应用程序,如果是这样,可能需要一些翻录。

想知道是否有人解决了这个问题。如果没有,我必须输入"特殊情况"或"基于时间"的代码,这两者都不是OO风格,至少不是我的首选方式(也不是我的同事(。

如果我错过了SO上的内容,请告诉我,但正如您所看到的,到目前为止我已经找到了一些答案。

谢谢

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

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

最新更新