ios - 如果我在 swift 中添加 UITapGestureRecognizer,UIButton 单击事件不起作用

标签 ios swift uibutton uitapgesturerecognizer

在我的登录页面上,如果我专注于 UITextEdit 以输入电子邮件和密码,则会出现键盘并向上滚动登录页面。如果我触摸键盘外部,我会添加此代码以删除键盘。

extension UIViewController {
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }
    
    @objc func dismissKeyboard() {
        view.endEditing(true)
        UIView.animate(withDuration: 0.3, animations: {
            self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
        })
    }
}

在我的 viewDidLoad() 函数中,我是这样添加的。

override func viewDidLoad() 
{
        super.viewDidLoad()
        //TODO
        self.hideKeyboardWhenTappedAround()
       ...
}

它运行良好,但是如果我在键盘仍处于打开状态时单击登录按钮,dismisskeyboard() 函数会起作用,但 btnClick 函数不起作用。

@IBAction func LoginBtnClick(_ sender: Any) 
{
        print("loginBtn")
        //...
}

我该如何解决这个问题?

最佳答案

我实际上以不同的方式解决了它(我在登录屏幕上遇到了同样的问题)。我只是将键盘的关闭/动画移动到一个异步 block 中,延迟很小,因为它看起来像点击识别器,它正在拾取触摸,但不是内部的触摸按钮,可能是因为屏幕已经开始播放键盘消失的动画。

@objc func dismissKeyboard() {
    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
        self.view.endEditing(true)
        UIView.animate(withDuration: 0.3, animations: {
            self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
        })
    }
}

关于ios - 如果我在 swift 中添加 UITapGestureRecognizer,UIButton 单击事件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48211042/

相关文章:

ios - 如何使用 Swift 绘制 720 个数据点

ios - 我应该为 iOS boolean 状态使用什么值?

Swift 在框架中找不到私有(private)结构定义

arrays - 如何将两个数组与拼接结合起来

iphone - 单击按钮时颜色变化

ios - 删除以前添加的库时出现问题

iOS swift : Returning a 'Bool' in a function that shows alert confirmation message

ios - 请求失败 : unauthorized (401) with Twitter login

ios - 使用 capinsets 调整图像大小

swift - 如何改变UIButton的位置?