Question

I am having a little problem. I want to make all my scrollview scroll to the top when I press a UITableViewCell. Following is the code in didSelectRowAtIndexPath:

[self.tableView setContentOffset:CGPointZero];
[verbTableView setContentOffset:CGPointZero];     
[seinhabenScrollView setContentOffset:CGPointZero];
[mdhPresensScroll setContentOffset:CGPointZero];
[mdhPreteritumScroll setContentOffset:CGPointZero];
[mhdScroll setContentOffset:CGPointZero];
....

There are more of those scrollview, and I want to put the all in one single object or something... I have tried following code:

for (UIScrollView *scrolls in topLayer.subviews)
{
    [scrolls setContentOffset:CGPointZero];
}

Thanks!

Was it helpful?

Solution

The basic idea is right. It just depends upon how you identify the scroll views. You could do something like the following, which explicitly tests whether the subview is a kind of UIScrollView:

for (UIScrollView *scrollView in self.view.subviews)
{
    if ([scrollView isKindOfClass:[UIScrollView class]])
        scrollView.contentOffset = CGPointZero;
}

Or you can explicitly reference the specific scrollviews in question (in which case the class membership test isn't strictly needed):

for (UIScrollView *scrollView in @[seinhabenScrollView, mdhPresensScroll, mdhPreteritumScroll])
{
    scrollView.contentOffset = CGPointZero;
}

Or, if you create an IBOutletCollection in IB, you can use that, too:

for (UIScrollView *scrollView in self.scrollViews)
{
    [scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];
}

(Note, in that final example, I'm scrolling to the location in question with animation, providing the user some visual cue as to what just happened; that's completely up to you.)


In a comment above, you say that topView has subviews which, themselves, have subviews that are scrollviews, you'd have to do something like the following to handle this subview-of-subview situation:

for (UIView *subview in topLayer.subviews)
{
    for (UIScrollView *scrollView in subview)
    {
        if ([scrollView isKindOfClass:[UIScrollView class]])
            scrollView.contentOffset = CGPointZero;
    }
}

OTHER TIPS

Avoiding the dynamic type check, just place the views that can scroll into an array. Then, a little fancier, add an extension to scroll view so they can scroll to zero using no params, that let's us do the scrolling with an NSArray one-liner (makeObjectsPerform...)...

@interface UIScrollView (ScrollToZero)
- (void)scrollToZero;  // a no-param method for scrolling to zero offset
@end

@implementation UIScrollView (ScrollToZero)
- (void)scrollToZero {
    [self setContentOffset:CGPointZero animated:YES];
}
@end


NSArray *allMyScrolls = @[verbTableView, seinhabenScrollView, // and so on.  put ONLY scrollViews in here
// you can make this array a property, initialized when the views are created

[allMyScrolls makeObjectsPerformSelector:@selector(scrollToZero)];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top