Непрерывное прикосновение в Swift - PullRequest
0 голосов
/ 10 апреля 2019

Цель состоит в том, чтобы выполнять действие каждые 0,5 секунды, пока нажатие кнопки поддерживается, и прекращать это действие после завершения касания.Следуя советам из других постов здесь, в SO, я применил стратегию использования логического значения, которое имеет значение true на touchDown и значение false на touchUp.Однако, похоже, что функция touchUp либо не устанавливает логическое значение, либо touchDown игнорирует его, потому что, когда я поднимаю свой искатель с кнопки, действие продолжается.

Вот мой код касаний:

// MARK: - Touches

func touchDown(atPoint pos : CGPoint) {
    print("Touched Down in \(purpose) down arrow")

    arrowIsPressed = true
    self.texture = SKTexture(imageNamed: "bottomArrowPressed.png")

    adjustBlue() // Because you want one immediate action, in case there is no continuous touch

    while arrowIsPressed == true {
        perform(#selector(callback), with: nil, afterDelay: 1.0)
    }
}

func touchUp(atPoint pos : CGPoint) {

    arrowIsPressed = false
    self.texture = SKTexture(imageNamed: "bottomArrow.png")

    adjustCounter = 0
}

// MARK: - Touch Helpers

@objc func callback() {

    self.adjustBlue()
}


func adjustBlue() {
    adjustCounter += 1
    print("Adjust Action \(adjustCounter)")
    // eventually useful code will go here
}

Обратите внимание, что это небольшая кнопка, и я не беспокоюсь о том, чтобы отслеживать несколько касаний.

Где моя логика не работает?Я чувствую, что это довольно прямая задача и решение, но я делаю что-то не так и не могу понять, что.

ОБНОВЛЕНИЕ: помещая оператор печати в цикл while, я вижу, что цикл while вызываетсяочень быстро снова и снова, даже если у меня есть оператор выполнения с задержкой в ​​0,5 секунды.Не уверен, почему ...

1 Ответ

1 голос
/ 23 апреля 2019

Моя интуиция кричит, что ваш цикл while блокирует основной поток.

Время не задерживается между итерациями, вместо этого вызывается обратный вызов.Между циклами нет никаких задержек, поэтому основной поток блокируется, и у функции touchup нет возможности запускаться.

Вы можете изменить это на

func touchDown(atPoint pos : CGPoint) {
     print("Touched Down in \(purpose) down arrow")

    arrowIsPressed = true
     self.texture = SKTexture(imageNamed: "bottomArrowPressed.png")

     adjustBlue() // Because you want one immediate action, in case there is no continuous touch

     callback()
 }

func touchUp(atPoint pos : CGPoint) {

    arrowIsPressed = false
    self.texture = SKTexture(imageNamed: "bottomArrow.png")

    adjustCounter = 0
}

// MARK: - Touch Helpers

@objc func callback() {
      adjustBlue()

    // loop in a non blocking way after 0.5 seconds
      DispatchQueue.main.asynAfter(deadline: .now() + 0.5) {
            if self.arrowIsPressed {
               self.callback()
            }
       }
}



func adjustBlue() {
    adjustCounter += 1
    print("Adjust Action \(adjustCounter)")
    // eventually useful code will go here
}
...