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");
}
Если какая-либо другая информация необходима или если есть более предпочтительный метод для этого, сообщите мне.
Ответы
Ответ 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
}