iOS 7.1 UITapGesture не работает с UIPickerView
используется UIPickerView
чтобы разрешить пользователю выбирать из списка опций. Мы добавляем UIPickerView
в качестве подвида контейнера UIView. Затем мы добавляем UITapGestureRecognizer в контейнер UIView
. The 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
Это было похоже на одновременный жест rencognizers на 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. Новая реализация сначала позволяет всем строкам сборщика претендовать на событие touch, прежде чем я, наконец, позволю самому сборщику претендовать на него.
Я говорю:почти потому что есть еще одно изменение в UIPickerView, где представления, видимые в палитре, могут больше не существовать. Таким образом, пользователь my tap видимое изображение строки, которая не центрирована в сборщике, и это может привести к прокрутке сборщика вместо выбора этой строки, потому что она больше не существует.
- (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:
Set gestureRecognizer
как true для обнаружения во всех версиях ios
Шаг 1: добавить UIGestureRecognizerDelegate
Шаг 2: добавить folloeing код в файл класса
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// return
return true;
}
принятый ответ очень полезен, спасибо! Я уже подкласс UIPickerView. Итак, следуя ZDidier, я сделал подкласс a UIGestureRecognizerDelegate
а потом обошел addGestureRecognizer
такой:
- (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
{
gestureRecognizer.delegate = self;
[super addGestureRecognizer:gestureRecognizer];
}
это исправило это для меня.
Swift метод для ленивых:
в соответствие с протоколом UIGestureRecognizerDelegate
и
override func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}