2015-03-09 4 views
0

Я наткнулся на эту проблему, и я не уверен, что было бы лучшим способом справиться с ней. Вопрос очень прост в воспроизведении, и я положил a simple demo project on GitHub for demonstration, но вот суть этого.pointInside: withEvent: вызывается при наборе текста на клавиатуре на iOS8

Предположим, у меня есть приложение для iPad с UITextField в его главном представлении. Ниже небольшой UIView подкласс, который реализует pointInside: withEvent:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    BOOL inside = CGRectContainsPoint(self.bounds, point); 
    NSLog(@"pointInside Called"); 
    return inside; 
} 

Запуск приложения, метод pointInside вызывается, если я нажимаю в любом месте на экране, но с клавиатуры; ввод текста на клавиатуре не вызывает метод pointInside.

Оставаясь на клавиатуре, я отправляю приложение в фоновом режиме, а затем возвращаюсь в приложение. Теперь, каждый раз, когда я набираю текст на клавиатуре, вызовется метод pointInside! Единственный способ, по которому я решил «исправить» проблему, - установить UITextEffectsWindow как keyAndVisible; но это не реально жизнеспособно, так как это может привести к другим побочным эффектам.

Любая идея, как с этим бороться? Моя проблема в том, что мы использовали этот метод в нашем приложении, чтобы отклонить всплывающее окно, когда пользователь выходит за его пределы. Но есть UITextField во всплывающем окне, и мы, очевидно, не хотят отказаться от всплывающих окон, когда пользователь начинает вводить в него ...

Заранее спасибо

+0

Причиной всех ложных срабатываний является система координат. Код спрашивает, находится ли касание в пределах видимости, получающей прикосновение. Конечно, это является. Вместо этого проверьте точку на каком-то кадре subview. Еще лучше прикрепите распознаватель жестов к виду (окнам), где крана должна заставить текстовое поле сбрасывать первый ответчик. – danh

+0

, но точка находится в поле зрения координат –

+0

Это не объясняет, почему pointInside не вызывается при наборе текста на клавиатуре до того, как приложение переходит на задний план, но потом. Проверка работает нормально, и нет ложных срабатываний. Единственная проблема заключается в том, что метод вызывается при наборе текста на клавиатуре в одном случае, а не в другом. – droussel

ответ

0

я, наконец, пошел с UITapGestureRecognizer добавил к UIWindow. Пользовательский вид добавляет его при переходе в новое окно и удаляет его при освобождении; отлично работает и решает мою проблему:

@property (strong, nonatomic) UITapGestureRecognizer *outsideTapRecognizer; 

- (void)willMoveToWindow:(UIWindow *)newWindow 
{ 
    if(self.outsideTapRecognizer){ 
     [self.window removeGestureRecognizer:self.outsideTapRecognizer]; 
    } 

    self.outsideTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOutside:)]; 
    [newWindow addGestureRecognizer:self.outsideTapRecognizer]; 
} 

- (void)tapOutside:(UIGestureRecognizer *)gestureRecognizer { 
    BOOL inside = CGRectContainsPoint(self.bounds, [gestureRecognizer locationInView:self]); 
    if (!inside) { 
     [self removeFromSuperview]; 
    } 
} 

- (void)dealloc 
{ 
    [self.window removeGestureRecognizer:self.outsideTapRecognizer]; 
} 
0

У меня нет реального ответа, и это звучит неправильно НО у меня есть два обходных

а) проверить штрихи мероприятия и игнорировать запрос, если он не имеет штрихов для вашего окна

б) использует gestureRecognizer, которая лежит выше всплывающего окна, чтобы определить, что делать в открытом состоянии от всплывающего окна

в) (это то, что мы делаем ... старый код еще до recognisers) замещают touchesBegan & сотрудничества на окне и передать щелчки делегата

+0

Странно/К сожалению, event.allTouches пуст, поэтому я не могу проверить, к какому окну они принадлежат. – droussel

+0

какой тип события? –

+0

Это UITouchesEvent; Я ожидал прикосновений :-) – droussel