Нажатие на кнопки без отпускания в Swift [дубликат]

Eliko спросил: 10 мая 2018 в 04:21 в: ios

У этого вопроса уже есть ответ:

  • Swift, touch down on UIButton and touch up on another 2 ответа

У меня есть 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)
}

Но то, что я получаю, это кнопка, которая касается, а затем, когда я касаюсь следующий, без выпуска, ничего не работает.

Любые предложения?

2 ответа

Qi Hao ответил: 10 мая 2018 в 04:42

Я думаю, что это проблема, связанная с мультитач. Вы можете попробовать включить мультитач представления.

self.view.isMultipleTouchEnabled = true
Eliko ответил: 10 мая 2018 в 04:54
Спасибо за помощь, но, к сожалению, это не работает на моем устройстве или симуляторе
andrei ответил: 10 мая 2018 в 06:38

Я не уверен точно, что не работает для вас, я реализовал простой тестовый проект и для меня касался следующей кнопки, не выпустив первый из них. Вот код, который я написал.

     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")
    }

Этот код был протестирован на iphone под управлением ios 11.4. Не могли бы вы дать дополнительную информацию?

EDIT: я обновил решение, чтобы оно срабатывало при перетаскивании пальца с одной кнопки на другую, извините за мое недоразумение. Надеюсь, что это работает для вас. Также имейте в виду, что теперь у вас будет другая проблема, ваше действие касания будет вызываться непрерывно, пока ваш палец находится внутри кнопки.

    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")
        }
    }
Eliko ответил: 10 мая 2018 в 06:08
Цените свою помощь, но я просто попробовал свой код на моем устройстве под управлением iOS 11.3 & xcode simulator, и он не работает. Он работает, когда я нажимаю на него двумя пальцами, но не только с одним.
andrei ответил: 10 мая 2018 в 06:17
Вы уверены, что это не связано с симулятором? Мой тест включал в себя один палец на первой кнопке, затем, удерживая эту кнопку нажатой, я нажимаю второй палец на вторую кнопку.
Eliko ответил: 10 мая 2018 в 06:19
Неправильно понято: я имел в виду поместить один палец на первую кнопку, затем перетащить этот палец на вторую кнопку, затем на третью и так далее ...

Дополнительное видео по вопросу: Нажатие на кнопки без отпускания в Swift [дубликат]

Swift Tutorial - Custom UIButton Class (Reusable)

Custom UIButton: Floating Action Button - Part 12 - Itinerary App (iOS, Xcode 9, Swift 4)

UIButton Animation - Swift