UIWindow子类:触摸事件未被触发

时间:2016-08-31 15:51:27

标签: ios swift uiwindow touchesbegan touchesended

我想在当前项目中实现会话时间功能。因此,我试图继承UIWindow并覆盖touchesBegantouchesEnded方法。

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)
    }
}

在app delegate中我做了这个

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

但问题是touchesBegan并且touchesEnded未被调用。我无法弄清楚我做错了什么。

4 个答案:

答案 0 :(得分:5)

除非没有其他人捕获触摸事件,否则不会为您的窗口调用touchesBegan(_:with:) API。通常情况并非如此,因为您希望UI元素接收触摸。

您希望在窗口子类中实现的是sendEvent(:_)并将您的逻辑放在那里。不要忘记调用超级实现来传递事件。

使用这种方法的小型ceveat是你会听到一些不是触摸事件的事件,但这可能不是问题,因为它们大多是用户生成的。

答案 1 :(得分:0)

我试图将UIWindow子类化并覆盖touchesBegan方法,当窗口有一个rootViewController检查演示项目时,touchesEnded会调用这些方法。 Sample app TouchTest

同时检查此方法 - (void)sendEvent:(UIEvent *)event

根据文档:您可以调用此方法将自定义事件分派给窗口的响应程序链。 窗口对象将触摸事件分派到发生触摸的视图中,并将其他类型的事件分派给最合适的目标对象

答案 2 :(得分:0)

跟踪会话的更好方法是注册UIApplication通知,例如UIApplicationDidEnterBackgroundNotificationUIApplicationDidFinishLaunchingNotification

UIApplication class reference底部提供了完整的应用程序通知列表。您可以创建一个会话跟踪器类,它可以干净地侦听这些内容,而不会干扰代码的其他部分。

答案 3 :(得分:-2)

而不是继承UIWindow。您可以在UITapGestureRecognizer的窗口中添加AppDelegate

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

如果您需要考虑除了点击之外的其他触摸,请同时使用UIPanGestureRecognizerUITapGestureRecognizer

如果您的子视图具有自己的手势识别器,请添加此扩展程序

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

并做

gestureRecogniger.delegate = self