UIScrollView 在模态视图控制器的动画演示中滚动到不同的位置

Posted

技术标签:

【中文标题】UIScrollView 在模态视图控制器的动画演示中滚动到不同的位置【英文标题】:UIScrollView scrolls to different position while animating presentation of modal view controller 【发布时间】:2013-07-03 06:32:45 【问题描述】:

我使用UIScrollView 来分页三个不同的UIViewControllers。寻呼机初始化为从开始显示第 1 页。所以用户可以从头开始向左或向右滑动。当我从中间视图控制器呈现模态视图控制器时,UIScrollView 在呈现视图控制器的动画期间临时滚动到第一页。当我关闭模态视图控制器时,一切都恢复正常,UIScrollView 显示中心视图控制器。

我希望(并希望)UIScrollView 在动画期间保持其位置。

这不是导致崩溃或其他问题的技术错误,它只是丑陋。

以前有人吃过吗?知道如何解决吗?

【问题讨论】:

所以要清楚,问题是当从第二页呈现模态转换时,您的滚动视图正在滚动回您的第一页?另外,您是否使用父子视图控制器包含? 能否请您尝试在 uiscrollview 上禁用分页并检查是否仍然出现? 您是否尝试将属性 scrollEnabled 设置为 NO 然后返回 YES ? 是的,正确的。是的,我们正在使用视图控制器容器。 在加载模态视图之前将 scrollEnabled 设置为 no right 没有帮助。 setPagingEnabled 也一样。这很奇怪,因为在动画期间关闭模态视图控制器时,我可以看到想要的第二个视图。不是它在节目动画期间制作的第一个动画。 【参考方案1】:

我也遇到过同样的问题,经过大量调查,这似乎是 UIKit 中与滚动视图和 AutoLayout 相关的错误。这是“修复”...

在 viewDidDisappear: 中,将当前的滚动视图 contentOffset 保存到一个属性中,并将其重置为零:

- (void)viewDidDisappear:(BOOL)animated 

    [super viewDidDisappear:animated];

    self.previousContentOffset = self.scrollView.contentOffset;

    self.scrollView.contentOffset = CGPointZero;

然后,在 viewWillAppear: 中,将内容偏移量重置回原来的值。我必须将它分派到主队列中才能正常工作:

- (void)viewWillAppear:(BOOL)animated 

    if (!CGPointEqualToPoint(self.previousContentOffset, CGPointZero))
    
        dispatch_async(dispatch_get_main_queue(), ^
            self.scrollView.contentOffset = self.previousContentOffset;
        );
    

【讨论】:

viewDidDisappearviewWillDisappear 中,scrollview.contentOffset 也是0, 0。并且self.scrollView.contentOffset = manual offset; 不执行,仅在添加延迟时才有效。

以上是关于UIScrollView 在模态视图控制器的动画演示中滚动到不同的位置的主要内容,如果未能解决你的问题,请参考以下文章

在模态视图控制器的解除动画时访问presentingViewController

如何连续关闭两个模态视图控制器*动画*?

如何自定义模态视图控制器呈现动画?

iPhone 模态视图动画帮助

我怎样才能呈现一个模态视图控制器,并带有默认的关闭动画?

在Scroll View的高度动画后,UIScrollView的子视图不响应触摸