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");
}
Если нужна какая-либо другая информация или если есть более предпочтительный метод для этого, пожалуйста, дайте мне знать.
5 ответов
У меня была такая же проблема, и у меня наконец появилось откровение:P
Это было похоже на одновременное распознавание жестов на uiPickerView не работает.
поэтому я использую делегат жест
<
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;
}
и тогда это работает!
Увидимся
Мне удалось почти восстановить исходную функциональность путем создания подкласса 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];
}
}
Попробуйте это Sol:
ЗадаватьgestureRecognizer
как верно, чтобы обнаружить во всех версиях IOSШаг 1: Добавить UIGestureRecognizerDelegate
Шаг 2: Добавьте следующий код в ваш файл класса
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// return
return true;
}
Принятый ответ очень полезен, спасибо! Я уже был подкласс UIPickerView. Итак, следуя ZDidier, я сделал подкласс UIGestureRecognizerDelegate
а затем перебор addGestureRecognizer
как это:
- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
gestureRecognizer.delegate = self;
[super addGestureRecognizer:gestureRecognizer];
}
Это исправило это для меня.
Свифт метод для ленивых:
соответствовать протоколу UIGestureRecognizerDelegate
а также
override func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}