Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIPickerView inside UITableView.tableFooterView doesn't receive drag touches

I have a UIPickerView in the footer of a table (from which I plan to issue "pagination"-style requests for the table--the picker will list the pages available of the LARGE data set I'm navigating, and let the user jump straight to any "page" of the data).

My picker receives taps; if I tap on a row of the picker that isn't the selected one, it rolls into the center space of the picker. But if I drag my finger on the picker, I scroll the TABLE, not the picker contents.

I tried installing a UIView subclass in my tableFooterView to see if I could catch touches, and I can... but not touches on the picker. Touches AROUND the picker do in fact fire that UIView subclass's -touchesBegan. But not ones on the picker itself.

like image 767
Dan Ray Avatar asked Feb 26 '23 11:02

Dan Ray


1 Answers

Here's what ended up working.

I made my table into a subclass of UITableView (called PickerSensitiveUITableView).

The I implemented this method:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView* result = [super hitTest:point withEvent:event];

    if ([result.superview isKindOfClass:[UIPickerView class]])
    {
          self.scrollEnabled = NO;
    }
    else 
    {
          self.scrollEnabled = YES;    
    }
    return result;
}

So now when the touch happens inside the bounds of the picker (actually ANY picker in the table!) it turns off the scrollability of the UITableView.

It occurs to me a more general solution would be to do this as a category on UIScrollView. The problem isn't with tables so much as with the UIScrollView that UITableView is a subclass of...

like image 137
Dan Ray Avatar answered Mar 09 '23 00:03

Dan Ray