iOS 7.1 UITapGesture not working with UIPickerView

后端 未结 5 763
野趣味
野趣味 2020-12-03 03:00

We are using a UIPickerView to allow a user to select from a list of options. We are adding UIPickerView as a subview of a container UIView. We a

相关标签:
5条回答
  • 2020-12-03 03:05

    The accepted answer is very helpful, thank you! I was already subclassing UIPickerView. So, following ZDidier, I made the subclass a UIGestureRecognizerDelegate and then overrode addGestureRecognizer like this:

    - (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
    {
        gestureRecognizer.delegate = self;
        [super addGestureRecognizer:gestureRecognizer];
    }
    

    That fixed it for me.

    0 讨论(0)
  • 2020-12-03 03:06

    I had the same problem, and I finally had a revelation :P

    It was like simultaneous gesture rencognizers on uiPickerView don't work.

    so I use the gesture delegate

    <
    UIGestureRecognizerDelegate>
    

    with

     // add tap gesture
        UITapGestureRecognizer* gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerViewTapGestureRecognized:)];
        [picker addGestureRecognizer:gestureRecognizer];
        gestureRecognizer.delegate = self;
    

    with

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        // return
        return true;
    }
    

    and then its working!

    See You

    0 讨论(0)
  • 2020-12-03 03:18

    Swift method for the lazy :

    conform to protocol UIGestureRecognizerDelegate

    and

    override func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
    
    0 讨论(0)
  • 2020-12-03 03:25

    I've managed to almost restore the original functionality by subclassing the UIPickerView and override the hitTest implementation. The new implementation first allows all of the rows of the picker to claim the touch event before I finally allow the picker itself to claim it.

    I say almost because there is another change to the UIPickerView where views that are visible in the picker may no longer exist. So the user my tap a visible image of a row that is not centered in the picker and it may cause the picker to scroll instead of selecting that row because it doesn't really exist anymore.

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        if (self.hidden) {
            return nil;
        }
        else {
            if (event.type == UIEventTypeTouches) {
                for (int component = 0; component < self.numberOfComponents; component++) {
                    for (int row = 0; row < [self numberOfRowsInComponent:component]; row++) {
                        UIView *view = [self viewForRow:row forComponent:0];
                        if (view) {
                            view = [view hitTest:[self convertPoint:point toView:view] withEvent:event];
                            if (view) {
                                return view;
                            }
                        }
                    }
                }
            }
            return [super hitTest:point withEvent:event];
        }
    }
    
    0 讨论(0)
  • 2020-12-03 03:25

    Try This Sol:

    Set gestureRecognizer as true to detect in all ios versions

    Step 1: Add UIGestureRecognizerDelegate

    Step 2: Add folloeing code into to your class file

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
        // return
        return true;
    }
    
    0 讨论(0)
提交回复
热议问题