iOS 7.1 UITapGesture not working with UIPickerView

孤者浪人 提交于 2020-01-09 04:47:29

问题


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 are then adding a UITapGestureRecognizer to the container UIView. The UITapGestureRecognizer is being used to dismiss the picker via removing it's super view.

In iOS 7.0 and previous versions, this was working as expected. However, in iOS 7.1 this set up is no longer working in the sense that UITapGestureRecognizer is not recognizing the tap and calling the selector specified in the action (dismissing the picker view and container view). code is below

   - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.nameList=[[NSMutableArray alloc] initWithObjects:@"A",@"B",@"C", nil];
    UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 200, 320, 200)];
    myPickerView.delegate = self;
    myPickerView.showsSelectionIndicator = YES;
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapInListPickerView:)];
    [singleTap setNumberOfTapsRequired:1];
    [singleTap setNumberOfTouchesRequired:1];
    [myPickerView addGestureRecognizer:singleTap];
    [self.view addSubview:myPickerView];
}

-(void)tapInListPickerView:(UIGestureRecognizer *)sender

{
    NSLog(@"Taped in pikcer view");
}

If any other info is needed or if there is a more preferred method for doing this, please let me know.


回答1:


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




回答2:


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



回答3:


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



回答4:


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.




回答5:


Swift method for the lazy :

conform to protocol UIGestureRecognizerDelegate

and

override func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}


来源:https://stackoverflow.com/questions/22319427/ios-7-1-uitapgesture-not-working-with-uipickerview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!