Swift 随处检测触摸

Swift Detect Touch Anywhere

我正在使用 Swift 编写我的第一个应用程序,我需要一个弹出窗口或模态视图,可以通过触摸屏幕上的任意位置将其关闭。

我正在编写一个 IOU 应用程序,目前正在研究用户输入贷方的视图以及他们借出的金额。显然每个贷方都需要有一个唯一的名称,并且我希望每当用户尝试输入相同的名称两次要求他们更改名称时出现一个弹出窗口或模式视图。为了减少刺激因素,我想这样做,以便用户可以点击屏幕上的任意位置来消除警告,而不是点击特定按钮。

我找到了这个答案:Detect touch globally,我认为它可能对我有用,但我对 Objective-C 一无所知,只知道 Swift,而且我对它的了解还不够,不知道该怎么做。

I'd like to make it so that the user can tap anywhere on the screen to dismiss the warning, rather than on a specific button.

这可能是一个非常非常糟糕的主意,您可能会遇到与模态视图中的文本字段或其他元素的手势冲突,或者您可能会在用户不小心关闭模态时让他们不高兴,但是,嘿,无论如何摇你的船。

获取模态视图中最顶层视图控制器的视图。如果它是包含 YourModalViewControllerUINavigationController,您可以在模态的 viewDidLoad:

中执行此操作
if let navController = self.navigationController {
    navController.view.addGestureRecognizer(UITapGestureRecognizer(...))
}

然后从手势识别器的操作方法中关闭您的模式。

我个人不知道如何关闭弹出窗口,因为我没有使用过它们,但我可以解决您的一个问题。你说你想在用户触摸屏幕上的任何地方时关闭弹出窗口或模式。这是一个在任何位置触摸屏幕时都会触发的函数,您可以在 apple documents.

中阅读更多相关信息
 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    }

事实证明,关闭模态视图非常容易。您需要做的就是调用 dismissViewControllerAnimated(true, completion: nil)。因此,为了做我想做的事,我需要做的就是:

override func touchesEnded(touches: NSSet, withEvent event: UIEvent)
{
  dismissViewControllerAnimated(true, completion: nil)
  super.touchesEnded(touches, withEvent: event)
}

Swift 3.0

// Add this to your UIViewController class

     override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

           //Do thing here
        }

我通过添加 UIGestureRecognizer 找到了一个很好的方法。

在 AppDelegate 中符合 UIGestureRecognizerDelegate,将其添加到您的

class AppDelegate: UIResponder, UIApplicationDelegate, UIGestureRecognizerDelegate {

...

添加点击手势

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        // add tapGestures to entire application
        let tapGesture = UITapGestureRecognizer(target: self, action: nil)
        tapGesture.delegate = self
        window?.addGestureRecognizer(tapGesture)

        return true
    }

添加gestureRecognizer协议函数:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    // User tapped on screen, do something

    return false
}

Swift 4.2 :

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        // Touch began
    }
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        // Touch end
    }

我正在处理一个应用程序。我们需要保持 10-15 分钟的会话。为此,我一直在寻找用户的触摸事件。

我已经在应用程序中安装了基本控制器。所以我在 viewwillappear 上更新了会话。我不需要任何触摸事件。

我找到了一个非常简单的解决方案。我正在 Xcode 13 和 Swift 5 上工作。使用这个:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  <nameOfTextField>.endEditing(true)
}

我用它来注册触摸并在点击屏幕上的任何地方时关闭键盘。 <nameOfTextField> 是首先触发键盘的文本字段。