Подкласс UIWindow: событие Touches не запускается

Я хочу реализовать функцию времени сеанса в моем текущем проекте. Так что для этого я пытаюсь подкласс UIWindow и переопределить touchesBegan а также touchesEnded методы.

class BaseWindow: UIWindow {

    convenience init() {
        self.init(frame: UIScreen.mainScreen().bounds)
    }

    private var sessionTimeOutTimer: NSTimer?

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        sessionTimeOutTimer?.invalidate()
    }

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        sessionTimeOutTimer = NSTimer.scheduledTimerWithTimeInterval(60, target: CIAppManager.sharedManger(), selector: #selector(CIAppManager.sessionTimeOut), userInfo: nil, repeats: false)
    }
}

В приложении делегат я сделал это

private let baseWindow = BaseWindow()
var window: UIWindow? {
    get {
        return baseWindow
    }
    set {}
}

Но проблема в том, touchesBegan а также touchesEnded не получить вызов. Я не могу понять, что я делаю не так.

4 ответа

Решение

touchesBegan(_:with:) API не будет вызываться для вашего окна, если только некому будет захватывать событие касания. Обычно это никогда не происходит, так как вы хотите, чтобы ваши элементы интерфейса получали прикосновения.

То, что вы хотите реализовать в своем подклассе окна sendEvent(:_) и поместите свою логику там. Не забудьте вызвать супер реализацию для передачи событий.

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

Я попытался создать подкласс UIWindow и переопределить методы touchesBegan, touchesEnded эти методы вызываются, когда у окна есть rootViewController для проверки демонстрационного проекта. Пример приложения TouchTest

Также проверьте этот метод- (void)sendEvent:(UIEvent *) событие

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

Лучшим способом отслеживания сессий будет регистрация UIApplication уведомления, такие как UIApplicationDidEnterBackgroundNotification а также UIApplicationDidFinishLaunchingNotification,

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

Вместо подклассов UIWindow, Можете добавить UITapGestureRecognizer в AppDelegateокно.

let gestureRecogniger = UITapGestureRecognizer(target: self, action: #selector(yourSelector)) // Implement your selector
gestureRecogniger.cancelsTouchesInView = false
window?.addGestureRecognizer(gestureRecogniger)

Если вам нужно учесть другие прикосновения, кроме касаний, используйте UIPanGestureRecognizer а также UITapGestureRecognizer все вместе.

Если у вас есть подпредставления, которые имеют свои собственные распознаватели жестов, добавьте это расширение

extension AppDelegate: UIGestureRecognizerDelegate {
    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

и делать

gestureRecogniger.delegate = self
Другие вопросы по тегам