Сенсорный объект для каждого пальца останется неизменным с тем же адресом памяти, пока он находится на экране. Вы можете отслеживать отдельные пальцы в сценарии с несколькими касаниями, сохраняя адреса сенсорных объектов в массиве, а затем сравнивая их с этим массивом, чтобы точно знать, какой палец движется.
var fingers = [String?](count:5, repeatedValue: nil)
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesBegan(touches, withEvent: event)
for touch in touches{
let point = touch.locationInView(self.view)
for (index,finger) in fingers.enumerate() {
if finger == nil {
fingers[index] = String(format: "%p", touch)
print("finger \(index+1): x=\(point.x) , y=\(point.y)")
break
}
}
}
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesMoved(touches, withEvent: event)
for touch in touches {
let point = touch.locationInView(self.view)
for (index,finger) in fingers.enumerate() {
if let finger = finger where finger == String(format: "%p", touch) {
print("finger \(index+1): x=\(point.x) , y=\(point.y)")
break
}
}
}
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
super.touchesEnded(touches, withEvent: event)
for touch in touches {
for (index,finger) in fingers.enumerate() {
if let finger = finger where finger == String(format: "%p", touch) {
fingers[index] = nil
break
}
}
}
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
super.touchesCancelled(touches, withEvent: event)
guard let touches = touches else {
return
}
touchesEnded(touches, withEvent: event)
}
Обновлено для Swift 4
Кредит @Klowne
var fingers = [UITouch?](repeating: nil, count:5)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
for touch in touches{
let point = touch.location(in: self.view)
for (index,finger) in fingers.enumerated() {
if finger == nil {
fingers[index] = touch
print("finger \(index+1): x=\(point.x) , y=\(point.y)")
break
}
}
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesMoved(touches, with: event)
for touch in touches {
let point = touch.location(in: self.view)
for (index,finger) in fingers.enumerated() {
if let finger = finger, finger == touch {
print("finger \(index+1): x=\(point.x) , y=\(point.y)")
break
}
}
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event)
for touch in touches {
for (index,finger) in fingers.enumerated() {
if let finger = finger, finger == touch {
fingers[index] = nil
break
}
}
}
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesCancelled(touches, with: event)
guard let touches = touches else {
return
}
touchesEnded(touches, with: event)
}
* Согласно обновленной документации Apple, теперь можно сохранять касания во время последовательности мультитач, если они отпускаются в конце последовательности.
person
Sam_M
schedule
03.10.2016