在应用程序启动时使用 OrientationDidChange 处理 UIScrollView 分页时如何避免“特殊情况”

问题描述 投票:0回答:1

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

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

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

要将页面滚动到右侧,其他问题让我记得手动设置 contentOffset,其中包含我需要的大部分内容。 currentPage = 当前 Y 偏移量 / 滚动视图的宽度。基础数学,酷。

这解决了我的大部分问题。为了正确的面向对象,我给了滚动视图一个重新布局功能,这与 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 风格,至少不是我喜欢的方式(也不是我的同事)。

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

谢谢

pagination uiscrollview
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.