IOS - 如何通过触摸视图外的任何位置来隐藏视图

时间:2017-02-22 07:43:41

标签: ios swift uiview

我是IOS编程的新手,我在点击按钮时显示一个视图,使用按钮方法中的以下代码。

 @IBAction func moreButton(_ sender: Any)
    {
        self.helpView.isHidden = false
    }

最初,self.helpView.isHiddenviewDidLoad方法中设置为true以隐藏视图。现在,我如何通过触摸视图外的任何位置来关闭此视图。从研究中我发现,可以通过创建适合整个viewController的透明按钮来完成。那么通过点击按钮,我们可以让视图解散。任何人都可以在swift 3中给我代码来创建这样的按钮。

或者,如果还有其他更好的隐藏视图的方式,欢迎使用。

我正在使用Xcode 8.2,swift 3.0

提前致谢。

12 个答案:

答案 0 :(得分:34)

在触摸开始时你应该像

一样写
    public class DimensionTO {
    private Dimension dimension;

    public Dimension getDimension () {
        return dimension;
    }

    public void setUser(Dimension dimension) {
        this.dimension= dimension;
    }

}

答案 1 :(得分:4)

您可以使用$(document).ready(function(){ var sliderValue = 0; if(localStorage.getItem("slider-value") !== undefined && localStorage.getItem("slider-value") !== ""){ sliderValue = localStorage.getItem("slider-value"); } $("#slider-value").text(sliderValue); $( "#slider" ).slider({ value: sliderValue, slide: function( event, ui ) { $( "#slider-value" ).html( ui.value ); localStorage.setItem("slider-value", ui.value); } }); 方法:

touchesBegan

答案 2 :(得分:4)

Swift 5.1:

这应该有助于在视图外被触摸后将其关闭。

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
    {
        let touch = touches.first
        if touch?.view != self.yourView
        { self.dismiss(animated: true, completion: nil) }
    }

答案 3 :(得分:1)

在所选的moreButton中,您可以执行类似这样的操作

 @IBAction func moreButton(_ sender: Any)
    {
        self.helpView.isHidden = false
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissView))
        view.addGestureRecognizer(tap)
    }

    func dismissView() {
        self.helpView.isHidden = true
        self.view.removeGestureRecognizer(tap)
    }

答案 4 :(得分:1)

在Swift 4中

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     let touch = touches.first
     if touch?.view == self.view {
        commentsTxtView.resignFirstResponder()
    }
}

答案 5 :(得分:0)

您可以创建另一个透明按钮,或者您的基本视图(假设它是按钮下方的单个视图)可以解决您尝试执行的操作。首先,你需要让它可以点击。然后你想要处理轻敲或未开发时发生的事情的逻辑。

答案 6 :(得分:0)

你可以实现你想做的事情(用Swift 4.1和Xcode 9.3测试):

class ViewController: UIViewController {

    ...

    private var dismissViewTap: UITapGestureRecognizer?

    override func viewDidLoad() {

        super.viewDidLoad()

        dismissViewTap = UITapGestureRecognizer(target: self, action: #selector(dismissView))

        if let tap = dismissViewTap {

            view.addGestureRecognizer(tap)

        } // if let

    } // viewDidLoad

    @objc private func dismissView() {

        guard let tap = dismissViewTap else {

            return

        } // guard

        guard helpView.isHidden == false else {

            return

        } // guard

        helpView.isHidden = true

        view.removeGestureRecognizer(tap)

    } // dismissView

    ...

} // ViewController

如果您想保留手势识别器(可能是因为您多次打开helpView),请将dismissView更改为此版本:

...

@objc private func dismissView() {

    guard helpView.isHidden == false else {

        return

    } // guard

    helpView.isHidden = true

} // dismissView

...

这就是......!

答案 7 :(得分:0)

您可以在Swift 4中使用此方法。

  

标签号添加到要添加操作的 uiview

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
{
    if touches.first?.view?.tag == 10{
        dismiss(animated: true, completion: nil)
        super.touchesEnded(touches , with: event)
    }
}

答案 8 :(得分:0)

迅速

 override func touchesBegan(_ touches: Set<AnyHashable>, withEvent event: UIEvent) {
     var touch: UITouch? = touches.first
     if touch?.view != self.yourView {
         self.yourView.isHidden = true
     }
 }

客观C

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  {
     UITouch *touch = [touches anyObject];
     if(touch.view != self.yourView){
         self.yourView.hidden = YES;
     }
 }

答案 9 :(得分:0)

在我的情况下,我遵循touchesEnded逻辑,

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if([touch view]== self.UIViewThatNeedsToBeDismissed) {
        NSLog(@"inside view touch");
    } else {
        NSLog(@"release it");
    }
}

答案 10 :(得分:0)

您可以使用以下功能,对视图名称的此检查将不起作用,但是如果您有多个视图,则会出现问题,您会发现,如果在第二个视图内点击,则会执行相同的操作。我希望添加tapGesture。这是另一种解决方案。

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


}

答案 11 :(得分:0)

Date== 2012-04-21 and ItemId==2

如果有人想要复制意大利面,那么您可以通过自定义UIPresentationController来做到这一点