Кажется, у меня возникли проблемы со следующей настройкой:
- У меня есть подкласс
UILongPressGestureRecognizer
(import UIKit.UIGestureRecognizerSubclass
), чтобы переопределитьtouchesMoved
. - У меня есть кнопка, содержащая объект этого подкласса GestureRecognizer, который вызывает селектор.
- Метод, вызываемый этим селектором, содержит обратный вызов, который будет вызываться исходным подклассом GestureRecognizer каждый раз, когда вызывается
touchesMoved
.
Поэтому, когда я долго нажимаю на кнопку, а затем перемещаю палец, обратный вызов вызывается несколько раз, и я могу просматривать свойства касаний, например, число. (touches.count
)
Я пытаюсь перевести контроллеры представления TabBarController на основе информации о касаниях, но когда я реализую это (через selectedIndex =
или UIView.transitionFromView()
), обратный вызов вызывается только в начале longPressEvent. (т.е. только один раз, а не несколько раз.) Я не уверен, почему это происходит. Поскольку кнопка находится в TabBarController, на нее не должны влиять переходы представлений.
Вот некоторые из соответствующих кодов:
Подкласс GestureRecognizer:
import UIKit.UIGestureRecognizerSubclass
class LongPressGestureRecongnizerSubclass: UILongPressGestureRecognizer{
var detectTouchesMoved = false
var toCallWhenTouchesMoved: ((touches: Set<UITouch>) -> ())?
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent) {
if detectTouchesMoved{
toCallWhenTouchesMoved?(touches: touches)
}
}
}
Метод делегата, вызываемый при распознавании longPress.
func centerButtonLongPressed(tabBarView: TabBarView!){
for gestureRecognizer in tabBarView.centerButton.gestureRecognizers!{
if let longPressGestureRecognizer = gestureRecognizer as? LongPressGestureRecongnizerSubclass{
longPressGestureRecognizer.detectTouchesMoved = true
longPressGestureRecognizer.toCallWhenTouchesMoved = ({(touches: Set<UITouch>) -> (Void) in
//Here I can view touches properties every time touchesMoved() is called, but not when I try to transition view here.
})
}
}
}
ОБНОВЛЕНИЕ:
Я понял, что проблема в том, что поскольку переход вызывается синхронно, он путается с touchesMoved()
. Когда я перемещаю метод перехода из потока пользовательского интерфейса, возникает следующая ошибка:
Это приложение модифицирует движок автомакета из фонового потока, что может привести к повреждению движка и странным сбоям. Это вызовет исключение в будущем выпуске.
Как предотвратить взаимодействие медленного синхронного кода перехода с touchesMoved()
?
Как я могу достичь того, что я предполагаю? Спасибо за любую помощь.