13
votes

I have a view controller with this hierarchy:

View Controller:

  • UIScrollView (scrollable horizontally)
  • UITableView (scrollable vertically)

enter image description here

I want to forward the vertical scrolls from my UIScrollView to the sibling UITableView, so that when the user scrolls up on the UIScrollView, the UITableView will scroll up instead. What would be the best way to do it?

I have tried these:

  • Detecting the vertical scroll in scrollViewDidScroll, it doesn't get called because the contentOffset of the scroll view does not change.
  • Subclassing the UIScrollView and overriding touchesMoved, I can't forward the touches to the table view because I don't have a reference to it in this class.
2
You can do this by creating a transparent view on top of your scrollView and using it to capture gestures. Pass through vertical gestures; intercept horizontal gestures and pass them to the tableView. The key piece is overriding the hitTest:withEvent method in your transparent view. (If that's not enough to go on, lemme know and I'll post an actual answer. :-)Anna Dickinson

2 Answers

3
votes

If the tableview is contained within the scroll view I believe you can set up the scroll view's gesture recognizers to respond only if the table view's gesture recognizers fail. I haven't had a chance to try this, but you should be able to set up a dependency between the gestures for each of the views.

UITableView* tableView = ...;
UIScrollView* scrollView = ...;
for (UIGestureRecognizer* r in scrollView.gestureRecognizers)
{
    for (UIGestureRecognizer* tableRecognizer in tableView.gestureRecognizers)
    {
        [r requireGestureRecognizerToFail:tableRecognizer];
    }
}
3
votes

This will make your scroll simultaneously with UITableView and UIScrollView and apply @Stephen Johnson's block

 - (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer
 shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer
 {
     return YES;
 }