如何找出哪个UIScrollView干扰scrollsToTop?

我有几个视图控制器与一个或多个滚动视图。 虽然我已经明确地在视图控制器中设置了多个滚动视图,但是当我点击状态栏时,一些滚动视图会拒绝向上滚动。

在推动另一个视图控制器并popup之后,手势有时在视图中起作用,但它以前没有。

这很混乱,我只是不知道问题是什么。 如何有效地debugging这个问题? 是否有状态栏的全局(私人)通知,所以我可以手动滚动视图?

我已经使用类似以下的代码来debugging这种情况,之前:

 - (void)findMisbehavingScrollViews { UIView *view = [[UIApplication sharedApplication] keyWindow]; [self findMisbehavingScrollViewsIn:view]; } - (void)findMisbehavingScrollViewsIn:(UIView *)view { if ([view isKindOfClass:[UIScrollView class]]) { NSLog(@"Found UIScrollView: %@", view); if ([(UIScrollView *)view scrollsToTop]) { NSLog(@"scrollsToTop = YES!"); } } for (UIView *subview in [view subviews]) { [self findMisbehavingScrollViewsIn:subview]; } } 

根据您find的UIScrollView的数量,您可以修改该代码以帮助debugging您的特定情况。

一些想法:

  • 更改各种滚动视图的背景颜色以在屏幕上标识它们。
  • 打印这些滚动视图的视图层次结构以标识其所有的高级视图。

理想情况下,您应该只在窗口层次结构中find一个将scrollsToTop设置为YES的UIScrollView。

为了方便起见,我把接受的答案变成了迅捷:

 func findMisbehavingScrollViews() { var aview = UIApplication.sharedApplication().keyWindow findMisbehavingScrollViewsIn(aview!) } func findMisbehavingScrollViewsIn(aview: UIView) { if aview.isKindOfClass(UIScrollView) { if (aview as! UIScrollView).scrollsToTop { print("found uiscrollview \(aview)") } } for bview in aview.subviews { findMisbehavingScrollViewsIn(bview) } }