Распознать все прикосновения в интерфейсе - PullRequest
1 голос
/ 03 апреля 2012

Я хочу иметь возможность распознавать ВСЕ касания в интерфейсе, независимо от того, что было затронуто.

Я пробовал:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

.. но это просто распознается, когда пользователь нажимает на что-то, что не реагирует на нажатия (например, uiimages)

Причина, по которой мне нужна эта способность, заключается в том, что я хочу включить слайд-шоу, если пользователь не касается экрана в течение 5 минут, поэтому я хочу сбросить таймер при каждом касании. Кажется неправильным помещать этот код сброса в каждое событие пользовательского интерфейса отдельно.

Ответы [ 5 ]

3 голосов
/ 03 апреля 2012

Есть несколько возможных решений, но, как сказал @omz - переопределение sendEvent: является лучшим.

@interface YourWindow : UIWindow {
    NSDate timeOfLastTouch;
}
@end

@implementation YourWindow
 - (void)sendEvent:(UIEvent *)event {
    [super sendEvent:event];

    NSSet *touches = [event allTouches];
      UITouch *touch = [touches anyObject];
    if( touch.phase == UITouchPhaseEnded ){
         timeOfLastTouch = [NSDate date];
    }
} 



@end

Не забудьте заменить UIWindow на YourWindow.

3 голосов
/ 03 апреля 2012

Вы можете создать подкласс UIWindow и переопределить метод sendEvent:.

1 голос
/ 29 августа 2012

Как сказал @Alladinian в одном из комментариев, в Справочной документации iOS упоминается, что подклассификация UIApplication является правильным приложением и, таким образом, кажется предпочтительнее подкласса UIWindow.срhttps://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html:

Вы можете решить подкласс UIApplication переопределить sendEvent: или sendAction: to: from: forEvent: для реализации пользовательского события и диспетчеризации действия.

1 голос
/ 03 апреля 2012

вы можете использовать жест касания

В вашем интерфейсе добавьте UIGestureRecognizerDelegate

@interface ViewController : UIViewController <UIGestureRecognizerDelegate> {

, затем в вашем viewDidLoad добавьте

UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapMethod)];
tapped.delegate=self;
tapped.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:tapped];

и введите код таймерав повернутом методе

-(void)tapped {
 //timer code
}

Убедитесь, что элементы пользовательского интерфейса имеют setUserInteractionEnabled:YES

1 голос
/ 03 апреля 2012

Вы можете создать подкласс UIWindow и переопределить метод sendEvent: следующим образом:

- (void)sendEvent:(UIEvent *)event {
  if (event.type == UIEventTypeTouches) {
     // You got a touch, do whatever you like
  };

  [super sendEvent:event];  // Let the window do the propagation of the event
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...