Поймать все сенсорные события в UIView? - PullRequest
1 голос
/ 25 апреля 2011

Я хочу, чтобы таймер сбрасывался каждый раз, когда пользователь касается экрана в моем приложении (поэтому я знаю, что пользователь все еще использует устройство). Я реализовал touchBegan в моем ViewController.

Проблема в том, что если в моем ViewController есть UITableView, а пользователь касается UITableView, функция touchBegan никогда не вызывается. Причина в том, что tableView не передает событие касания.

Что я понимаю, вы можете либо создать подкласс UITableView, чтобы передать его в суперпредставление, либо добавить прозрачный UIView сверху, который только улавливает сенсорные события и передает их. Проблема с подклассами заключается в том, что мне нужно сделать это на всех классах, которые отлавливают событие касания.

Есть ли лучшее решение? Если нет, то как вы передаёте событие в его супервью?

Ответы [ 3 ]

2 голосов
/ 25 апреля 2011

В верхней части моей головы, вы можете подкласс UIWindow или UIApplication и переопределить sendEvent:(UIEvent *)event и принять оттуда действие.

ex (если вы переопределите UIApplication)

- (void)sendEvent:(UIEvent *)event {
   if (event.type == UIEventTypeTouches)
      [(YourApplicationDelegate *)self.delegate wakeUp:event];
   [super sendEvent:event];
}  

Это может быть немного агрессивно для того, что вы пытаетесь сделать.Хотелось бы увидеть другие идеи.

1 голос
/ 31 января 2014

Вышеуказанные решения больше не работают с iOS 7.

Если вы просто хотите знать, когда касались экрана, добавьте следующее в ваш файл ViewController.m ...

- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer 
                                                shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer
{
  if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan)
  {
    // yes, it was touched!
  }
  return YES;
}
0 голосов
/ 28 апреля 2011

Я не думаю, что вы должны создавать подкласс UIScrollView (или UITableView - который простирается от UIScrollView) только для обработки сенсорных событий, поскольку есть и другие способы достичь того, что вы можете искать в более чистом виде. способ.

При использовании UISCrollView или MKMapView (который также не передает события касания) я обычно использую UIGestureRecognizer для отлова определенных событий касания, которые я ищу.

В некоторых конкретных случаях, например, для обработки прикосновения UITableView на экране, чтобы просто убрать клавиатуру, я установил для свойства UIScrollView userInteractionEnable значение NO в методе делегата textViewDidBeginEditing UITextView. и затем установите userInteractionEnable на YES на textViewDidEndEditing. Это позволит мне поймать touchesBegan без подклассов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...