質問

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!

役に立ちましたか?

解決

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

他のヒント

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)];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top