如果我们在后台点击任何地方,除了在 swift 中点击 popView 之外,如何删除 popView
Posted
技术标签:
【中文标题】如果我们在后台点击任何地方,除了在 swift 中点击 popView 之外,如何删除 popView【英文标题】:How to remove popView if we tap anywhere in the background except tapping in popView in swift 【发布时间】:2019-11-13 11:10:05 【问题描述】:我在 ViewController 中创建了一个带有文本字段和按钮的 popView。如果我点击按钮然后popView出现,我可以在文本字段中输入文本并提交工作,如果我点击视图中的任何地方我也可以删除popView,但是如果我点击popView中的任何地方我想要不想关闭 popView,请在代码中帮助我。
这是我的代码:
import UIKit
class PopUPViewController: UIViewController
@IBOutlet weak var popView: UIView!
@IBOutlet weak var inputField: UITextField!
@IBOutlet weak var textLabel: UILabel!
override func viewDidLoad()
super.viewDidLoad()
popView.isHidden = true
// Do any additional setup after loading the view.
@IBAction func butnAct(_ sender: Any)
view?.backgroundColor = UIColor(white: 1, alpha: 0.9)
popView.isHidden = false
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(PopUPViewController.dismissView))
view.addGestureRecognizer(tap)
@objc func dismissView()
self.popView.isHidden = true
view?.backgroundColor = .white
@IBAction func sendButton(_ sender: Any)
self.textLabel.text = inputField.text
在我的代码中,如果我点击视图中的任何位置,popView 正在移除,即使我点击 popView 也将其移除,我不需要这样做,如果我点击 popView,则 popView 不需要被移除。
请帮我写代码
【问题讨论】:
【参考方案1】:当new touch
在view
或window
中detected
时,您可以override
touchesBegan 方法triggered
。通过使用这个method
,您可以检查特定的view
是否被触摸。
这样试试
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
let touch = touches.first
if touch?.view != self.popView
dismissView()
func dismissView()
self.popView.isHidden = true
view?.backgroundColor = .white
【讨论】:
【参考方案2】:这不是我设计的方式,但要解决您面临的问题,您需要调整您的 dismissView
方法,以便它仅在点击位于 popView 之外时关闭视图。
为此,请修改您的选择器以将发件人(UITapGestureRecogniser
)作为参数包含:
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(PopUPViewController.dismissView(_:)))
然后在您的函数中接受该参数并测试点击是否在您的视图内,如果是,请不要关闭视图:
@objc func dismissView(_ sender: UITapGestureRegognizer)
let tapPoint = sender.location(in: self.popView)
if self.popView.point(inside: tapPoint, with: nil)) == false
self.popView.isHidden = true
view?.backgroundColor = .white
【讨论】:
【参考方案3】:您的 Popup 视图位于 viewcontroller 的父视图内,这就是为什么点击 popview 时您的 popview 也会被隐藏。 因此,为了避免只在后台添加一个视图并将其命名为 bgView 或任何您想要的名称,并将其替换为视图。它会正常工作。
代码:
@IBOutlet weak var bgView: UIView!//Add this new outlet
@IBOutlet weak var popView: UIView!
@IBOutlet weak var inputField: UITextField!
@IBOutlet weak var textLabel: UILabel!
@IBOutlet weak var submitButton: UIButton!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
popView.isHidden = true
@IBAction func butnAct(_ sender: Any)
bgView.backgroundColor = UIColor(white: 1, alpha: 0.9)//change view to bgView[![enter image description here][1]][1]
popView.isHidden = false
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.dismissView))
bgView.addGestureRecognizer(tap)//change view to bgView
@objc func dismissView()
self.popView.isHidden = true
bgView.backgroundColor = .white//change view to bgView
@IBAction func sendButton(_ sender: Any)
self.textLabel.text = inputField.text
【讨论】:
感谢兄弟第一个答案解决了我的问题..但感谢您的详细回答以上是关于如果我们在后台点击任何地方,除了在 swift 中点击 popView 之外,如何删除 popView的主要内容,如果未能解决你的问题,请参考以下文章
swift - xcode10 - 点击事件交互BUG - (手势和button的addTarget方法)