Как я могу сказать своему приложению игнорировать определенные прикосновения? - PullRequest
0 голосов
/ 25 января 2019

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

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

let touchThreshold : CGFloat = 21.0

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        if touch.majorRadius > touchThreshold {
            //dismiss the touch(???)
        } else {
            //draw touch on screen
        }
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        if touch.majorRadius > touchThreshold {
            //dismiss the touch(???)
        } else {
            //draw touch on screen
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Если вы хотите обнаружить только определенные типы касаний, вот возможное решение:

Вариант 1

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    touches.forEach { touch in
        switch touch.type {
        case .direct, .pencil:
            handleTouch(for: touch.majorRadius)
        case .indirect:
            // don't do anything
            return
        }
    }
}

func handleTouch(for size: CGFloat) {
    switch size {
    case _ where size > touchThreshold:
        print("do something")
    default:
        print("do something else")
    }
}

Вариант 2

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    touches.filter{($0.type == .direct || $0.type == .pencil || $0.type == .stylus) && $0.majorRadius > touchThreshold}.forEach { touch in
        print("do something")
    }
}

Вы можете прочитать больше типов касаний здесь .

0 голосов
/ 25 января 2019

Вы можете использовать этот метод вместо

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
       shouldReceiveTouch:(UITouch *)touch;

, где вы можете проверить тип жеста, например, если распознаватель жестов имеет тип UITapGestureRecognizer

Вы можете проверить, является ли основной радиус касаниянаходится в пределах вашего порогового предела, и если он находится в пределах вашего порога, вы передаете значение true, иначе вы передаете значение false.

   - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
                                       shouldReceiveTouch:(UITouch *)touch
         {
                 if touch.majorRadius > touchThreshold 
                  {
                      //dismiss the touch(???)
                     return No;
                  } 
                  else 
                  {
                       //draw touch on screen
                      return Yes;
                   }

UIGestureRecognizer

UITouch

Вы также можете использовать допуск Большого радиуса, чтобы определить точность большого радиуса

Подробнее о допуске Большого радиуса

...