【问题标题】:Clicking on buttons without releasing touch in Swift [duplicate]在Swift中单击按钮而不释放触摸[重复]
【发布时间】:2018-06-03 18:01:30
【问题描述】:

我连续有 5 个按钮:

我试图检测用户对所有按钮的触摸而不释放他的触摸 - 就像触摸钢琴一样。

到目前为止,我尝试过这个:

func buildButtons() {
      button.addTarget(self, action: #selector(buttonAction), for: .touchDown)
      view.addSubview(button)
}

@objc func buttonAction(sender: UIButton) {
      sender.isEnabled = false
      sender.isEnabled = true
      print(sender.tag)
}

但是我得到的是一个被触摸的按钮,然后当我触摸下一个按钮时,没有释放,没有任何作用。

有什么建议吗?

【问题讨论】:

    标签: ios swift xcode uibutton


    【解决方案1】:

    我认为这是与多点触控有关的问题。您可以尝试启用视图的多点触控。

    self.view.isMultipleTouchEnabled = true
    

    【讨论】:

    • 感谢您的帮助,但不幸的是它在我的设备和模拟器上都不起作用
    【解决方案2】:

    我不确定究竟是什么不适合你,我已经实施了一个简单的测试项目,并且我在不释放第一个按钮的情况下按下下一个按钮。这是我写的代码

         override func viewDidLoad() {
            super.viewDidLoad()
    
            let stackView = UIStackView(frame: CGRect(origin: CGPoint(x: 40.0, y: 40.0), size: CGSize(width: 300, height: 45)))
            stackView.axis = .horizontal
            stackView.distribution = .fillEqually
            stackView.spacing = 10
    
            let button1 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
            let button2 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
            let button3 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
    
            [button1, button2, button3].forEach { button in
                button.backgroundColor = .blue
                stackView.addArrangedSubview(button)
                button.addTarget(self, action: #selector(touchDownAction), for: .touchDown)
            }
    
            view.addSubview(stackView)
        }
    
        @objc func touchDownAction() {
            print("touched button")
        }
    

    此代码在运行 ios 11.4 的 iphone 上进行了测试。你能提供一些额外的信息吗?

    编辑:我已经更新了解决方案,以便在将手指从一个按钮拖动到下一个按钮时它可以工作,抱歉我的误解。希望这对你有用。另外请记住,现在您将遇到另一个问题,当您的手指在按钮内时,您的触摸操作将被连续调用。

        var button1: UIButton!
        var button2: UIButton!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let stackView = UIStackView(frame: CGRect(origin: CGPoint(x: 40.0, y: 40.0), size: CGSize(width: 300, height: 45)))
            stackView.axis = .horizontal
            stackView.distribution = .fillEqually
            stackView.spacing = 10
    
            button1 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
            button2 = UIButton(frame: CGRect(origin: .zero, size: CGSize(width: 45, height: 45)))
    
            [button1, button2].forEach { button in
                button!.backgroundColor = .blue
                stackView.addArrangedSubview(button!)
            }
    
            view.addSubview(stackView)
        }
    
        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
            let touchLocation = touches.first!.location(in: view)
            let button1FrameInMainView = button1.convert(button1.bounds, to: view)
            let button2FrameInMainView = button2.convert(button2.bounds, to: view)
    
            if button1FrameInMainView.contains(touchLocation) {
                print("touch inside button 1")
            }
    
            if button2FrameInMainView.contains(touchLocation) {
                print("touch inside button 2")
            }
        }
    

    【讨论】:

    • 感谢您的帮助,但我刚刚在运行 iOS 11.3 和 xcode 模拟器的设备上尝试了您的代码,但它不起作用.. 当我用两根手指点击它时它确实有效,但不仅仅是一。
    • 你确定不是模拟器的问题?我的测试是将一根手指放在第一个按钮上,然后在按住该按钮的同时,将另一根手指放在第二个按钮上。
    • 有一个误解:我的意思是把一根手指放在第一个按钮上,然后把这个手指拖到第二个按钮上,然后拖到第三个按钮上……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多