Подтвердить что ты не робот

IOS 7.1 UITapGesture не работает с UIPickerView

Мы используем UIPickerView, чтобы пользователь мог выбирать из списка параметров. Мы добавляем UIPickerView в качестве подсмотра контейнера UIView. Затем мы добавляем UITapGestureRecognizer в контейнер UIView. UITapGestureRecognizer используется для отклонения выбора, удаляя его супер-просмотр.

В iOS 7.0 и предыдущих версиях это работало, как ожидалось. Однако в iOS 7.1 эта настройка больше не работает в том смысле, что UITapGestureRecognizer не распознает нажатие и вызывает селектор, указанный в действии (отклонение представления выбора и вид контейнера). код ниже

   - (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");
}

Если какая-либо другая информация необходима или если есть более предпочтительный метод для этого, сообщите мне.

4b9b3361

Ответ 1

У меня была та же проблема, и у меня наконец было откровение: P

Это было похоже на одновременное использование rencognizers на uiPickerView.

поэтому я использую делегата gesture

<
UIGestureRecognizerDelegate>

с

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

с

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

а затем его работа!

Смотрите вас

Ответ 2

Мне удалось почти восстановить исходную функциональность, подклассифицировав UIPickerView и переопределив реализацию hitTest. Новая реализация сначала позволяет всем строкам сборщика требовать события касания, прежде чем я, наконец, разрешу самому сборщику заявить об этом.

Я говорю почти потому, что есть другое изменение в UIPickerView, где виды, видимые в сборщике, могут больше не существовать. Таким образом, пользователь нажимает на видимое изображение строки, которая не сосредоточена в сборщике, и это может привести к тому, что выборщик будет прокручиваться, а не выбирать эту строку, потому что она больше не существует.

- (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

Попробуйте это Sol:

Установите gestureRecognizer как истину для обнаружения во всех версиях ios

Шаг 1: Добавить UIGestureRecognizerDelegate

Шаг 2: Добавьте следующий код в свой файл класса

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

Ответ 4

Принятый ответ очень полезен, спасибо! Я уже подклассифицировал UIPickerView. Итак, после ZDidier, я сделал подкласс a UIGestureRecognizerDelegate, а затем переделал addGestureRecognizer следующим образом:

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

Это исправило это для меня.

Ответ 5

Метод Swift для ленивых:

соответствует протоколу UIGestureRecognizerDelegate

и

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