How to find out which other UIScrollView interferes with scrollsToTop?

I have several view controllers with one or multiple scrollviews. Although I have explicitly set the scrollsToTop flags in view controllers with more than one scroll view, some scroll views refuse to scroll up when I tap the status bar.

After pushing another view controller and popping it the gesture sometimes works in the view it previously hasn’t.

  • Accept payment on ios apps?
  • swift spritekit Facebook share button
  • ipa file size issue in Xamarin iOS
  • How can i create excel sheet and file in iPhone sdk?
  • Saving image to Documents directory and retrieving for email attachment
  • Mac Bluetooth MAP profile
  • It’s very confusing and I just don’t know what the problem is. How can this issue effectively be debugged? Is there a global (private) notification for the status bar tap so I could scroll the views manually?

    2 Solutions Collect From Internet About “How to find out which other UIScrollView interferes with scrollsToTop?”

    I have used code like the following to debug this scenario, before:

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

    Depending on how many UIScrollViews you find, you can modify that code to help debug your particular situation.

    Some ideas:

    • Change the background colors of the various scrollviews to identify them on screen.
    • Print the view hierarchy of those scrollviews to identify all of their superviews.

    Ideally, you should only find a single UIScrollView in the window hierarchy that has scrollsToTop set to YES.

    I changed the accepted answers into swift for convenience:

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