3

将 UIScrollView 控制器与 iPhone 4 和 iOS 5.1 结合使用时,我遇到了一个奇怪的问题。

我有一个 UIScrollView,其内容大小为 640x480(有效双屏),除了在两个“屏幕”之间切换的滑动之外,我还允许用户点击屏幕以响应我称之为...

[scrollView scrollRectToVisible:(CGRectMake 320,0,320,480) animated:YES];

如果在显示滚动视图的右侧时发生点击,则第一个 320 将为 0(请注意,滚动视图已启用分页,因此它只能完全靠左或完全靠右)。

我还有一种情况,有时我会在包含滚动视图的视图控制器上以模态方式使用 presentModalViewController 显示一个额外的视图控制器。

一切正常,直到模态视图控制器出现并随后被解除,之后如果动画设置为 YES,则 scrollRectToVisible 方法将不再起作用(如果我将动画更改为 NO,那么它会按预期工作)。请注意,点击仍在注册,并且 scrollRectToVisible 正在被调用,当动画设置为 YES 时它什么也不做)。

关键是,这个错误只发生在运行 iOS 5.x 的 iPhone 4 上。
它在我的以下设备上完美运行(即使在显示模态视图控制器之后):运行 4.x 的 iPhone 3G、运行 3.x 的 iPhone 3GS、运行 4.x 的 iPod touch(第 2 代),最令人惊讶的是运行 5.x 的模拟器.

我想知道这是否是动画系统中的错误,因此禁用了模态视图控制器演示文稿上的动画并关闭,这没有效果,问题仍然出现在 iOS 5.1 的 iPhone 4 上。

有人对可能导致此问题的原因以及我如何解决此问题有任何想法吗?

4

3 回答 3

2

终于找到了这个。什么猪……

我将视图控制器中的视图嵌入为另一个视图控制器视图的子视图。所以我的滚动视图包含一个视图,它也有一个关联的视图控制器。

在 iOS 5.x 之前,方法 viewWillAppear、viewWillDisappear、viewDidAppear 和 viewWillDisappear 永远不会在子视图视图控制器上调用,只会在主视图控制器上调用。已经知道这一点,我将我的主视图控制器设置为在这些事件发生时手动调用子视图视图控制器方法。

然而,在 iOS 5.x 中,这个问题似乎已被“修复”,因此在我手动将 viewWillAppear 的调用传递给我的子视图控制器时,我不再需要在 5.x 下执行此操作,因为该方法会在 5.x 下自动调用。 x - 因此它现在在 5.x 下被调用了两次,但在 4.x 或更早的设备上运行时仍然只调用一次。

结果,在 5.x 下,我用来调用我的 updateUI 方法的 NSTimer 被创建了两次,但是因为在 viewDidDisappear 中,我只在它不是 nil 时才销毁计时器,它只会被销毁一次 - 因此我在 5.x 下泄漏 NSTimer。 x 通过双重分配,我不在 4.x 以下。

由于多个 NSTimers 反复调用我的 updateUI 方法,结果是 UI 的不断更新正在杀死动画系统,因此在实际设备上运行时,scrollView 的动画会失败。我猜它在运行 5.x 的模拟器上继续运行良好,因为 Mac 中的 CPU 不仅能够处理额外的工作负载,而且仍然正确地执行动画。

在我的 viewWillAppear 方法中进行简单检查以确保尚未创建 NSTimer 已解决问题并保持与 4.x 及更早版本的兼容性。

每次 Apple 通过主要版本更新他们的 iOS 时,我都会沮丧地遇到这些问题......这个故事的士气是不要假设长期存在的课程在不同的操作系统版本下仍然表现出相同的行为。

于 2012-05-10T19:27:29.547 回答
0

我有同样的问题。我意识到,在我的班次下班后被modalViewController解雇了 20像素,这与状态栏的高度相同。所以,这意味着当我的加载和创建时,认为没有状态栏,实际上它在那里。 所以我尝试放入viewDidLoadUIScrollerViewUIViewControllerUIScrollViewUIScrollView

[[UIApplication sharedApplication] setStatusBarHidden:NO];

现在我UIScrollView总是停留在状态栏下,Y 位置为 20px。它永远不会向下移动。

于 2013-02-14T11:50:52.693 回答
0

我终于设法让它在运行 5.1 的 iPhone4 上运行。确保设置滚动视图的水平反弹属性可以解决问题,尽管为什么不选中这个会首先导致问题超出我的理解——我很确定这是 iOS 中的一个错误。

于 2012-05-09T14:07:06.750 回答