iOS 5.1中模态视图控制器显示后,UIScrollView无法正常工作。

3

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

我有一个UIScrollView,内容尺寸为640x480(实际上是双屏),除了可以通过滑动在两个“屏幕”之间切换外,我还允许用户点击屏幕。响应点击后,我会调用类似以下的东西...

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

如果在滚动视图的右侧显示时发生了轻拍(请注意,滚动视图启用了分页功能,因此只能完全左侧或完全右侧停止),则前320个值将为0。

我还遇到一种情况,即有时使用presentModalViewController在包含滚动视图的此视图控制器上额外显示一个视图控制器。

一切都很完美,直到呈现模态视图控制器并在其后被解除呈现,之后scrollRectToVisible方法将不再起作用(如果将animated设置为YES,则不起作用;如果将其更改为NO,则按预期工作)。请注意,仍然正在注册轻拍并调用scrollRectToVisible,但当animated设置为YES时,它不执行任何操作。

问题是这个漏洞仅会在运行iOS 5.x的iPhone 4上出现。
在我的以下设备上,即使在显示模态视图控制器之后,也可以完美地工作: 运行4.x的iPhone 3G, 运行3.x的iPhone 3GS, 运行4.x的iPod touch(第二代) 以及最让人惊讶的是运行5.x的模拟器。

我想知道是否这是动画系统中的一个错误,所以在模态视图控制器演示和解除演示时禁用了动画,但这没有效果,在运行iOS 5.1的iPhone 4上仍然出现问题。

有人有任何想法是什么导致了这个问题,以及我如何解决它吗?

3个回答

2

最终找到了问题所在,真是太麻烦了...

我正在将一个视图控制器的视图嵌入到另一个视图控制器的视图中作为子视图。因此,我的滚动视图包含一个视图,该视图也有一个关联的视图控制器。

在iOS 5.x之前,子视图的视图控制器上从未调用过viewWillAppear、viewWillDisappear、viewDidAppear和viewWillDisappear方法,只有主视图控制器会被调用。已经知道这一点后,我设置了我的主视图控制器,手动调用子视图控制器的方法。

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

因此,在5.x下,我的NSTimer用于调用我的updateUI方法被创建了两次,但由于在viewDidDisappear中我只销毁非空的计时器,因此它只被销毁了一次-因此在5.x下我通过双重分配泄漏NSTimers,而在4.x下则不会发生。

由于多个NSTimers一直存在,反复调用我的updateUI方法,导致UI的不断更新正在破坏动画系统,因此在实际设备上运行时,scrollView的动画失败了。我想它在运行5.x的模拟器上仍然正常工作,因为Mac中的CPU足以处理额外的工作量,并正确执行动画。

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

每当苹果通过主要版本更新其iOS时,我总是遇到这些问题... 这个故事的寓意是不要假设长期存在的类在不同版本的操作系统下仍然表现出相同的行为。


0

我终于成功在运行5.1的iPhone4上实现了这个功能。确保滚动视图的水平弹跳属性被设置为固定值解决了问题,但是为什么未选中此选项会导致问题发生,这超出了我的理解范围 - 我相当确定这是iOS中的一个错误。


好的,它在我更新到iOS 5.1.1之前是有效的,但现在这个解决方法不再起作用了... - Richard Baxter

0

我有同样的问题。我意识到在modalViewController关闭后,我的UIScrollerView会向下移动20px,这正是状态栏的高度。所以,这意味着当我的UIViewController被加载并创建UIScrollView时,UIScrollView认为没有状态栏,但实际上它存在。
所以我尝试在viewDidLoad中加入代码:

[[UIApplication sharedApplication] setStatusBarHidden:NO];

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


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