11

在 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 方法。我的两个问题都解决了,我找不到任何负面后果。这不是一个解决方案,我不会使用这种方法,因为我不知道我到底做了什么。

4

3 回答 3

1

我在 iOS 14 中遇到了同样的问题。看起来没有正常的方法来阻止调用_adjustContentOffsetIfNecessary. didMoveToWindow()在问题视图中覆盖对我有帮助

override func didMoveToWindow() {
    super.didMoveToWindow()
    // window == nil when new screen pushed
    if window == nil {
        // Set correct offset that was before
    }
}
于 2020-11-21T13:26:17.960 回答
1

我在 Twitter 上发现了一个有趣的讨论。虽然这不是我的情况,但它可能会帮助某人:

Is there some trick to bring UINavigationController to not mess with a UIScrollView  (_adjustContentOffsetIfNecessary)?

@steipete Searching for the same thing and came across your tweet. I set contentOffset but it resets back to -64 (ios7). Did you find a fix?
 @errthling Add a dummy view as first subview. It won’t look further.
 @steipete Wow – that worked. I've been struggling with it for days. Thanks for that and everything else you put out there! :)
 @errthling happy to help!

@steipete did you find an answer to this, 2 years ago? =D my scrollview's contentOffset is reset when I push a new viewcontroller..
 @manuelmaly Yeah. Changed the view hierarchy so the scroll view is not the main view and not the first subview, and UIKit stops messing.
 @steipete oO i hacked it in the meantime by blocking setContentOffset before pushViewController is called. your solution seems cleaner tho

推特讨论

于 2017-08-11T08:51:06.543 回答
0

将 UIViewController 与 UITableView 一起使用,而不是 UITableViewController。它解决了我的问题:)

于 2017-10-06T02:12:40.720 回答