Как поймать событие касания в каждом представлении приложения?

Я хочу поймать событие касания во всех моих представлениях. Поэтому оно должно иметь дело с appdelegate.

я сослался

iPhone: определение бездействия пользователя/времени простоя с момента последнего касания экрана

но не было успеха

Надеюсь, я пойду в правильном направлении

Спасибо


person illuminatus    schedule 09.02.2011    source источник


Ответы (4)


Делегат приложения не является ответчиком. Я бы подклассировал UIWindow и переопределил его методы обработки событий, потому что окно получает все события касания в первый раз.

person MHC    schedule 10.02.2011
comment
Я согласен с этим, но я думаю об альтернативном методе - подклассе UIApplication и переопределении его методов обработки событий. - person illuminatus; 10.02.2011
comment
Вы не поняли сути. Вы имеете дело с событиями в прямом или косвенном подклассе UIResponder. Система доставляет события в свой объект окна (связанный с делегатом приложения через свойство окна, которое, в свою очередь, отправляет их в каждое представление. Таким образом, окно — это то место, где вы видите ВСЕ события в первую очередь. Другими словами, это наиболее эффективный способ получения желаемого. - person MHC; 10.02.2011

Вопреки тому, что говорит futureelilte7, ваш делегат приложения (генерируемый при создании проекта) фактически является подклассом UIResponder и отвечает на селектор touchesBegan:withEvent: и другие подобные селекторы.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];

    // your code here
}

Это должно сохранить поведение касания по умолчанию и дать вам возможность выполнять собственные пользовательские функции.

person mtmurdock    schedule 22.02.2012

Нет необходимости создавать подклассы UIWindow, пример кода простого сквозного жеста здесь, улавливающий все прикосновения для всех представлений:

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

fileprivate var timer ... //timer logic here

@objc public class CatchAllGesture : UIGestureRecognizer {
    override public func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent) {
        super.touchesBegan(touches, with: event)
    }
    override public func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent) {
        //reset your timer here
        state = .failed
        super.touchesEnded(touches, with: event)
    }
    override public func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {
        super.touchesMoved(touches, with: event)
    }
}

@objc extension YOURAPPAppDelegate {

    func addGesture () {
        let aGesture = CatchAllGesture(target: nil, action: nil)
        aGesture.cancelsTouchesInView = false
        self.window.addGestureRecognizer(aGesture)
    }
}

В вашем методе запуска делегата вашего приложения просто вызовите addGesture, и все готово. Все касания будут проходить через методы CatchAllGesture, не препятствуя работе других.

https://stackoverflow.com/a/45496010/199966

person Jlam    schedule 03.08.2017

просто реализовать

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

{

UITouch *touch = [[event allTouches] anyObject];

CGPoint touchLocation = [touch locationInView:self.view];

//your logic

}

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

{ 

//your logic

}  


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

{

//your logic

}

в вашем коде .. Я думаю, что остальное вы можете понять.

person Sat    schedule 09.02.2011
comment
Спасибо ... но проблема в том, как реализовать это в классе делегата приложения. Я знаю, что это можно сделать в контроллерах представления. Но было бы утомительно писать во всех контроллерах представления. - person illuminatus; 10.02.2011
comment
Делегат приложения не является подклассом UIResponder. На экране нет визуального представления делегата, поэтому то, что вы предлагаете, не имеет смысла. Просто определите прикосновение от окна, но тогда вам придется обрабатывать все прикосновения самостоятельно. - person futureelite7; 10.02.2011