【问题标题】:UIScrollView contentOffset change after another view pushedUIScrollView contentOffset 在另一个视图被推送后发生变化
【发布时间】:2013-09-12 22:30:29
【问题描述】:

我在 Interface Builder 中有一个 UIViewController,我在 UIView 中添加了一个 UIScrollView。它的contentOffset 属性等于0.0,但是当我将UIScrollView 滚动到最底部并推动另一个视图时,contentOffset 会发生变化。

NSLog 给了我以下值:

//View just loaded
2013-09-09 16:19:27.455 my_app[24588:907] Scroll View content offset is 0.000000

//We came back from another view
2013-09-09 16:19:30.957 my_app[24588:907] Scroll View content offset is 108.000000

这种行为的原因是什么?我刚刚在 IB 中添加了一个 UIScrollView 并且根本没有在代码中做任何事情。

scrollView 的contentHeight 大于self.view.height。 scrollView 的frame 保持不变。

【问题讨论】:

    标签: ios cocoa-touch uiview uiscrollview interface-builder


    【解决方案1】:

    请参阅my answer 来回答类似问题。

    您需要在viewWillAppear:viewWillDisappear: 中适当地设置滚动视图的contentOffset

    另外,请参阅:

    【讨论】:

    • 天哪,多么可怕的错误!希望 Xcode 5 和 iOS 7 修复它。感谢您的最终回答!
    • 没问题,我希望它也能尽快修复 :)
    • 哈哈,StephSharp @SergeyGrischyov 5 年过去了,这个问题仍然存在。
    • 只有这个有效,我什至试过UIScrollViewContentInsetAdjustmentNever也失败了。
    【解决方案2】:

    对于 iOS 7/8 self.automaticallyAdjustsScrollViewInsets = NO; 解决了这个问题。

    【讨论】:

    • 小心,这仅适用于iOS7分钟
    • 这对我来说是最好的解决方法,将 contentOffset 设置为 0 会导致可见的跳转。
    • Thiis 没有为我解决这个问题,我必须遵循已接受答案中的指南并手动更新 contentOffset 中的 viewDidLayoutSubviews 。知道这个问题是怎么回事 - 它的 2015 年!
    【解决方案3】:

    我遇到了类似的问题,在关闭 viewController 后,tableView 的 contentOffset 更改为 (0, -64)。

    我的解决方案有点奇怪,我尝试了所有其他答案但没有成功, 解决我的问题的唯一方法是在 .xib 的控件树中切换 tableView 位置

    它是父视图中的第一个控件,如下所示:

    我在 ImageView 之后移动了 tableView 并且它起作用了:

    似乎将表格视图放在第一个位置会导致问题,将表格视图移动到另一个位置可以解决问题。

    P.D.我没有使用 autoLayout 也没有故事板

    希望这可以帮助某人!

    【讨论】:

      【解决方案4】:

      当您离开滚动视图所在的屏幕并返回时,它将在顶部或左侧或两者上增加一半的屏幕大小。一个空白,你不想要的东西。在我的情况下,分页变得一团糟并且无法正常工作,直到我作为用户以编程方式或通过触摸将滚动条放入 CGPointZero 中。如果你在viewDidLayoutSubviews 上调用NSLog( @"%f", scrollview.contentSize.height );,你会看到大小发生了变化。

      它发生在偏移值不为​​零的轴上。所以,要解决它,你应该在它出现之前将它设置为零CGPointZero

      @Steph Sharp 答案解决了我的问题,除非我将视图控制器作为弹出窗口打开 (presentViewController)。我试图通过在viewDidLayoutSubviews 上添加错误数量来补偿该值,但它会破坏分页。

      简短的回答,我最终得到:

      - (void) viewDidLayoutSubviews
      {
          [super viewDidLayoutSubviews];
          scrollView.contentOffset = previousPoint;
      }
      
      - (void) viewWillAppear:(BOOL)animated
      {
          scrollView.contentOffset = CGPointZero;
      }
      
      - (void) viewWillDisappear:(BOOL)animated
      {
          previousPoint = scrollView.contentOffset;
          scrollView.contentOffset = CGPointZero;
      }
      

      现在,当我离开该部分或打开上方的弹出窗口时,它可以工作。

      【讨论】:

        【解决方案5】:

        我在 UITableView 上使用 https://github.com/michaeltyson/TPKeyboardAvoiding

        我的解决方案是从 UITableView 中删除类 TPKeyboardAvoidingTableView。它导致 TableViewController 出现静态和动态单元格的滚动问题。

        【讨论】:

          【解决方案6】:

          检查滚动视图的contentSize 属性是否为CGSizeZero。我遇到了类似的问题,因为 contentSize 尚未设置。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-11-23
            • 2020-10-03
            • 2017-08-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多