Избегайте защемления тремя пальцами в UIPinchGestureRecognizer в swift
Согласно документации Apple, щипки - это непрерывный жест, и их нужно использовать двумя пальцами. Даже с трехкратным нажатием пальца в Swift 4.1 все работает нормально.
Я пытался напечатать количество касаний. Даже с тремя пальцами он дает число касаний, равное 2. Кажется, он обнаруживает первые два касания пальцами и игнорирует третье. Так что фильтровать невозможно.
@objc func pinch(pinchGesture: UIPinchGestureRecognizer){
if pinchGesture.state == UIGestureRecognizerState.began {
print("number of touches:\(pinchGesture.numberOfTouches)")
}
}
Я вызываю метод setupGesture() в viewDidLoad. Таким образом, он обрабатывает соответствующие жесты пользователя.
func setupGestures(){
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinch))
pinch.delegate = self
self.addGestureRecognizer(pinch)
}
Есть ли какой-нибудь возможный способ избежать трех пальцев в ios?
2 ответа
Вы можете фильтровать прикосновения в:
func touchesBegan(_ touches: Set<UITouch>,
with event: UIEvent)
Например, получить количество касаний из аргумента touches
и если touches.count > 2
тогда не действуй на этот жест - игнорируй его.
EDIT (1):
После вашего редактирования у меня появилась другая идея (у меня нет Mac со мной, поэтому я не могу попробовать это прямо сейчас). Попробуйте использовать этот метод от делегата. Вы должны быть в состоянии связаться, прежде чем принять. Я не вижу информации, будет ли она вызываться один раз или по одному на каждое прикосновение (каждый палец). Может быть, вы можете использовать это каким-то образом?
В последнее время я выяснил подход к этой проблеме. Это может быть не лучшим решением или альтернативами. Но это работает.
Здесь я просто держу логическое значение
var numberOfAllTouchesLessThanOrEqualsToTwo = false
Я использовал обработчик событий, чтобы установить логическое значение.
override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?){
if (event?.allTouches?.count)! > 2 {
numberOfAllTouchesLessThanOrEqualsToTwo = false
}else{
numberOfAllTouchesLessThanOrEqualsToTwo = true
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if (event?.allTouches?.count)! > 2 {
numberOfAllTouchesLessThanOrEqualsToTwo = false
}else{
numberOfAllTouchesLessThanOrEqualsToTwo = true
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if (event?.allTouches?.count)! > 2 {
numberOfAllTouchesLessThanOrEqualsToTwo = false
}else{
numberOfAllTouchesLessThanOrEqualsToTwo = true
}
}
и я использовал этот логический внутренний распознаватель жестов.
@objc func pinch(pinchGesture: UIPinchGestureRecognizer){
if pinchGesture.state == UIGestureRecognizerState.changed {
if numberOfAllTouchesLessThanOrEqualsToTwo {
//code
}
}
}
Оно работает.