Как реагировать на сенсорные события в UIWindow? - PullRequest
6 голосов
/ 07 октября 2009

Можно ли обрабатывать сенсорные события в ключе UIWindow в приложении Delegate или где-либо еще?

Любая помощь будет оценена, пожалуйста.

Ответы [ 4 ]

10 голосов
/ 16 июня 2010

В UIWindow есть удобный метод catch-all, называемый sendEvent:, который видит каждое событие в начале конвейера обработки событий. Если вы хотите выполнить какую-либо нестандартную дополнительную обработку событий, это хорошее место для ее размещения. Примерно так:

- (void)sendEvent:(UIEvent *)event {
  if ([self eventIsNoteworthy:event]) [self extraEventHandling:event];
  [super sendEvent:event];  // Apple says you must always call this!
}

Документы: Ссылка на класс UIWindow | Документы по доставке событий iOS

В этом блоге также упоминается, как переопределить hitTest:withEvent:, чтобы перехватить некоторые события, прежде чем они будут привязаны к целевому листовому подвиду в иерархии представлений. Вы также можете переопределить этот метод для вашего UIWindow объекта, если хотите.

4 голосов
/ 08 мая 2012

Вам придется создать подкласс UIWindow с вашим собственным классом и переопределить метод sendEvent:. Но помните, что метод получает другие типы событий - не только касания, поэтому вы должны проверить тип события (event.type == UIEventTypeTouches). Кроме того, поскольку вы получаете набор касаний, вы можете проверить, какие из них только что начались, какие закончились, переместились и т. Д. Для этого вам нужно выполнить итерацию по allTouches и проверить свойство phase каждого UITouch.

@implementation TouchWindow

- (void)sendEvent:(UIEvent *)event {

    if (event.type == UIEventTypeTouches) {
        for(UITouch * t in [event allTouches]) {
            if(t.phase == UITouchPhaseBegan) {
                /*
                Paste your code here. 
                Inform objects that some touch has occurred. 
                It's your choice if you want to perform method/selector directly, 
                use protocols/delegates, notification center or sth else. 
                */
            }
        }
    }

    [super sendEvent:event];
}

@end

Конечно, TouchWindow является подклассом UIWindow

@interface TouchWindow : UIWindow 
@end

И вам, вероятно, придется изменить этот класс в файле .xib в XCode

3 голосов
/ 07 октября 2009

UIWindow является подклассом UIView, поэтому вы просто создаете его подкласс и используете его в своем AppDelegate:

self.window = [[MyWindow alloc] initWithFrame:CGRectMake(0,0,320,480)]; // Sorry for hard-coded frame size!

и в MyWindow вы переопределяете -hitTest: withEvent: и / или -pointInside: withEvent:

0 голосов
/ 07 октября 2009

UIWindow является подклассом UIResponder, который имеет API-интерфейсы для обработки событий касания (например, touchesBegan:withEvent:). Тогда вы можете создать подкласс UIWindow, переопределить API-интерфейсы обработки событий касания и сами управлять событиями касания.

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