禁用除按钮内部以外的任何地方的触摸? - 斯威夫特

Posted

技术标签:

【中文标题】禁用除按钮内部以外的任何地方的触摸? - 斯威夫特【英文标题】:Disable touches everywhere except inside of a button? - Swift 【发布时间】:2016-06-26 06:00:21 【问题描述】:

当我在游戏中死去时,我想忽略用户的所有触摸事件,除非用户点击重置游戏按钮内部或重置游戏按钮。这是我的代码。

  for touch in touches
        let location = touch.locationInNode(self)

        if died == true
            Ball.physicsBody?.velocity = CGVectorMake(0, 0)
            if resetGame.containsPoint(location)

                restartScene()
                runAction(SKAction.playSoundFileNamed("Woosh.wav", waitForCompletion: false))

            

            else  


                self.userInteractionEnabled = false



            

这一切都在我的 touchesBegan 之内。这是我试图忽略用户的触摸,除非触摸的位置在按钮的大小范围内。我怎样才能忽略用户在屏幕上除按钮之外的任何地方的触摸? resetGame 是一个 SKSpriteNode 图像。

【问题讨论】:

我们在哪个班? 在我们的 gameScene.swift 中,在 touchesBegan 方法中。 什么是 resetGame 变量?也许只是为整个班级发布代码? 其实。我有个问题。这段代码有什么问题?你还能点击其他东西吗,或者这段代码到底在做什么? 它忽略屏幕上的所有触摸。甚至是按钮内的触摸。 resetGame 只是一个图像,按下时会重新启动场景。 【参考方案1】:

您的问题有两种解决方案。

我想向您提出的第一个案例是基于手势识别器的。 您可以将按钮与其他触摸事件分开,并通过如下布尔变量打开/关闭触摸事件:

手势识别器:

在你的类的全局变量声明部分:

var tapGesture :UITapGestureRecognizer!
var enableTouches:Bool = true

override func didMoveToView(view: SKView) 
        super.didMoveToView(view)
        self.tapGesture = UITapGestureRecognizer(target: self, action: #selector(GameClass.simpleTap(_:)))
        self.tapGesture.cancelsTouchesInView = false
        view.addGestureRecognizer(tapGesture)
        myBtn.name = "myBtn"


func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool 
        return self.enableTouches


func simpleTap(sender: UITapGestureRecognizer) 
        print("simple tap")
        if sender.state == .Ended 
           var touchLocation: CGPoint = sender.locationInView(sender.view)
           touchLocation = self.convertPointFromView(touchLocation)
           let touchedNode = self.nodeAtPoint(touchLocation)
           // do your stuff
           if touchedNode.name == "myBtn"  
              // button pressed, do your stuff
           
        


override func update(currentTime: CFTimeInterval) 
        /* Called before each frame is rendered */
       if died == true  
            self.enableTouches = false // disable all touches but leave gestures enabled
            //do whatever you want when hero is died
       


只有一个布尔值

我想提出的第二个解决方案是通过使用简单的布尔值来简单地停止触摸流(它不是很优雅,但它很有效)。 此方法查看何时点击按钮,更新方法检查您的英雄是否已死亡,因此所有触摸都将被禁用:

在你的类的全局变量声明部分:

var enableTouches:Bool = true

override func didMoveToView(view: SKView) 
            super.didMoveToView(view)
            myBtn.name = "myBtn"


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
        if (!enableTouches) 
            return
        

        let touch = touches.first
        let positionInScene = touch!.locationInNode(self)
        let touchedNode = self.nodeAtPoint(positionInScene)
        // do your stuff
        if touchedNode.name == "myBtn"  
           // button pressed, do your stuff
           if died == true  
                self.enableTouches = false // disable all touches
                //do whatever you want when hero is died
           
        


override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) 
        if (!enableTouches) 
            return
        

        let touch = touches.first
        let positionInScene = touch!.locationInNode(self)
        let touchedNode = self.nodeAtPoint(positionInScene)
        // do your stuff



override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) 
        if (!enableTouches) 
            return
        

第一种情况允许您始终启用手势,这样当您的英雄死亡时,您也可以使用手势做其他事情。当您按下按钮并执行“模流”时,第二种情况会停止您的触摸。选择最适合您的。

【讨论】:

以上是关于禁用除按钮内部以外的任何地方的触摸? - 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章

触摸 UITextField 以外的任何地方时如何关闭键盘(快速)?

尝试在移动网络上创建触摸滑动和删除功能。没有除 jquery 以外的库

如何检测iCarouselButtonDemo的触摸点?

php 禁用除管理员以外的所有用户的Wordpress管理栏

PHP 禁用除管理员以外的所有用户的Wordpress管理栏

禁用除第一行以外的所有行,并在上面的行充满数据时启用每一行