如何找出哪个UIScrollView干扰了scrollsToTop?

时间:2011-12-15 22:57:10

标签: iphone ios cocoa-touch ios5

我有几个带有一个或多个滚动视图的视图控制器。虽然我已在具有多个滚动视图的视图控制器中显式设置scrollsToTop标志,但是当我点击状态栏时,某些滚动视图拒绝向上滚动。

在推动另一个视图控制器并弹出它后,手势有时会在之前没有的视图中起作用。

这非常混乱,我只是不知道问题是什么。如何有效地调试此问题?是否有状态栏点击的全局(私人)通知,以便我可以手动滚动视图?

2 个答案:

答案 0 :(得分:22)

我之前使用过以下代码来调试这个场景:

- (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];
    }
}

根据您找到的UIScrollView的数量,您可以修改该代码以帮助调试您的特定情况。

一些想法:

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

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

答案 1 :(得分:1)

为方便起见,我将接受的答案改为swift:

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)
    }
}