_adjustContentOffsetIfNecessary - UIScrollView自动滚动到顶部

时间:2014-05-23 07:58:03

标签: ios7 uiscrollview interactivepopgesture

在iOS 7上。 我有导航控制器,我在堆栈顶部推送一个新的VC。

新VC有一个UIScrollView,它填充VC的根视图并垂直滚动。如果我向下滚动一点,然后尝试使用'滑动返回'/'滑动到弹出'手势,垂直滚动视图首先滚动到顶部,然后识别interactivePopGesture,我可以拖动顶部VC向左和向右堆叠。

为什么会这样? 我希望防止我的滚动视图在识别“滑动返回”手势之前自动滚动到顶部。 我该怎么做?

更新#1:

当我创建一个新的xcode项目时,我似乎无法重现这个错误,所以在原始项目中我肯定是错误的。当我找到原因时会更新。

更新#2:

当识别interactivePopGesture时,在我的垂直滚动视图上调用setContentOffset方法。在调试时,我看到setContentOffset已调用UIScrollViewInternal _adjustContentOffsetIfNecessary

更新#3:

在以下情况中会发生同样的问题: 我在垂直UIScrollView中有UITextFields。按下某个UITextField时,会出现一个键盘。当我想以交互方式关闭键盘时(通过在键盘上滚动滚动视图),在我释放拖动后,会出现故障。 UIScrollView的内容偏移暂时设置为零,然后设置回原始内容偏移并继续动画。 contentOffset也会调用此UIScrollViewInternal _adjustContentOffsetIfNecessary的不需要的设置。

我继续使用我自己的UIScrollView子类在两个场景中替换了UIScrollView。在该子类中,我将私有方法-(void) _adjustContentOffsetIfNecessary重写为空void方法。我的两个问题都被消除了,我找不到任何负面后果。这不是解决方案,我不会使用这种方法,因为我不知道我到底做了什么。

2 个答案:

答案 0 :(得分:0)

使用UIViewController和UITableView而不是UITableViewController。它解决了我的问题:)

答案 1 :(得分:0)

我在iOS 14中也遇到了同样的问题。似乎没有阻止_adjustContentOffsetIfNecessary的正常方法。在问题视图中覆盖didMoveToWindow()对我有帮助

override func didMoveToWindow() {
    super.didMoveToWindow()
    // window == nil when new screen pushed
    if window == nil {
        // Set correct offset that was before
    }
}