我想在我的当前项目中实现会话时间功能。为此,我试图对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没有被调用。我不知道我做错了什么。
发布于 2016-09-04 09:56:14
除非没有其他人来捕获触摸事件,否则不会为您的窗口调用touchesBegan(_:with:) API。通常情况下永远不会发生这种情况,因为您希望您的UI元素能够接受触摸。
您希望在窗口子类中实现的是sendEvent(:_),并将您的逻辑放在那里。不要忘记调用超级实现来传递事件。
使用这种方法的一个小例子是,您将听到一些不是触摸事件的事件,但这可能不是一个问题,因为它们大多是用户生成的。
发布于 2016-09-04 18:42:33
而不是子类UIWindow。您可以在UITapGestureRecognizer的窗口中添加AppDelegate。
let gestureRecogniger = UITapGestureRecognizer(target: self, action: #selector(yourSelector)) // Implement your selector
gestureRecogniger.cancelsTouchesInView = false
window?.addGestureRecognizer(gestureRecogniger)如果您需要考虑除taps之外的其他触摸,请将UIPanGestureRecognizer和UITapGestureRecognizer放在一起。
如果有具有自己手势识别器的子视图,则添加此扩展。
extension AppDelegate: UIGestureRecognizerDelegate {
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}并这样做
gestureRecogniger.delegate = self发布于 2016-09-05 16:57:15
我尝试将UIWindow子类化并重写touchesBegan方法,当窗口让rootViewController检查演示项目时,会调用这些方法。示例应用程序TouchTest
还检查这个方法- (void)sendEvent:(UIEvent *)event
根据文档:您可以调用此方法将自定义事件分派到窗口的响应链。窗口对象将触摸事件分派给发生触摸的视图,并将其他类型的事件分派给最合适的目标对象。
https://stackoverflow.com/questions/39254025
复制相似问题