是否有可能检测到所有人在一个地方发生的手势?

时间:2017-05-12 07:54:30

标签: ios swift

是否有可能在iOS的中心位置检测屏幕上发生的手势,例如,我认为在AppDelegate中。我知道我们可以为每个视图设置手势识别器。但我想在一个中心位置知道所有的平移/滚动行为都在发生。因此,当手势行为发生时,可以设置一些标志。

3 个答案:

答案 0 :(得分:1)

你可以这样:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
    window?.addGestureRecognizer(tap)
    return true
 }

 func tapped() {
    print("tapped")
 }

然而,这并不总是有效,因为您添加的任何交互式UI元素都会拦截手势。但是有一个解决方案可以让你找到总是:

 (...)   
 let tap = UITapGestureRecognizer(target: self, action: #selector(tapped))
 tap.delegate = self
 window?.addGestureRecognizer(tap)
 (...)

然后实现委托:

 extension AppDelegate: UIGestureRecognizerDelegate {
     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        return true
     }
 }

这样它不会破坏应用程序的任何正常行为,但您将能够检测手势识别器委托方法中的所有触摸。

答案 1 :(得分:0)

View或View Controller是您应该放置触摸事件或手势的地方,因为它在逻辑上很好地组织或维护您的代码。

但是,有时候,特别是在可可开发中,你可能会有几个具有完全相同功能的事件。例如您可以在应用程序中使用功能按钮,也可以在cocoa应用程序的顶部栏中使用相同的功能菜单项。在这种情况下,您应该将代码放在一个位置以共享代码。

您可以将更改标记代码放在委托中,并从视图或视图控制器中的手势代码中调用它。

答案 2 :(得分:0)

带有Scene Delegate的iOS 13 +

user3581248在这里让我处于正确的轨道,我已经为iOS 13更新了它。

// SceneDelegate
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    guard let _ = (scene as? UIWindowScene) else { return }

    setupGlobalAccessToDebugScreen()
}

func setupGlobalAccessToDebugScreen() {
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapped))
    tapGesture.delegate = self
    tapGesture.numberOfTapsRequired = 6
    self.window?.addGestureRecognizer(tapGesture)
}

@objc func tapped() {
    // your action
}

// pass taps on to regular controls, don't block them
extension SceneDelegate: UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
       return true
    }
}