мультитач в iOS [дубликат]

Я получил это из .ipa, созданного как артефакт Дженкинса. Проблема для меня заключалась в том, что Дженкинс использовал другой профиль обеспечения.

Я вручную установил Jenkins для использования того же профиля, что и обновленная версия, которую я пытался установить, и он начал работать.

6
задан Fr4nc3sc0NL 24 February 2015 в 13:59
поделиться

6 ответов

** Обновлено до Swift 4 и Xcode 9 (8 октября 2017 г.) **

Прежде всего, не забудьте включить события с несколькими касаниями, установив

self.view.isMultipleTouchEnabled = true

в ваш код UIViewController или с помощью соответствующей опции раскадровки в Xcode:

В противном случае вы всегда получите одно касание в touchesBegan ( см. документацию здесь ).

Затем внутри touchesBegan перебираем множество касаний, чтобы получить их координаты:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in: self.view)
        print(location)
    }
}
14
ответ дан Para 23 August 2018 в 00:17
поделиться
  • 1
    Спасибо за ваш ответ! Я отметил ответ giorashc как наиболее полезный, потому что он дал немного больше информации, но оба метода работают :) – Fr4nc3sc0NL 24 February 2015 в 15:03
  • 2
    Пожалуйста! Это ваш звонок, конечно :) Я немного отредактировал ответ и оставил ссылки на документацию, подчеркнув, как важно включить multi-touch или код не будет работать (мы всегда забыли об этом!). Я оставляю этот ответ в качестве ссылки для других людей, которым может понадобиться эта деталь :) – Para 24 February 2015 в 15:37

В Swift 1.2 это изменилось, и touchesBegan теперь предоставляет набор NSObjects. Чтобы выполнить итерацию через них, нарисуйте коллекцию касаний как набор объектов UITouch следующим образом:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

    var touchSet = touches as! Set<UITouch>

    for touch in touchSet{
        let location = touch.locationInView(self.view)
        println(location)
    }
}
1
ответ дан Andrew 23 August 2018 в 00:17
поделиться
  • 1
    Должен ли я отмечать этот ответ как ответ на вопрос? (Так как теперь отмеченный ответ больше не является ответом) – Fr4nc3sc0NL 18 September 2015 в 08:26

Вы должны перебирать разные касания. Таким образом, вы можете получить доступ к каждому прикосновению.

for touch in touches{
  //Handle touch
  let touchLocation = touch.locationInView(self.view)
}
1
ответ дан Christian 23 August 2018 в 00:17
поделиться

данный аргумент touches представляет собой набор обнаруженных касаний. Вы видите только одно касание, потому что вы выбираете одно из касаний с помощью:

touches.anyObject() // Selects a random object (touch) from the set

. Чтобы получить все касания, выполните итерацию заданного набора

for obj in touches.allObjects {
   let touch = obj as UITouch
   let location = touch.locationInView(self.view)
   println(location)
}
4
ответ дан giorashc 23 August 2018 в 00:17
поделиться

Для Swift 3, основанный на ответе @ Andrew:

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

    let touchSet = touches

    for touch in touchSet{
        let location = touch.location(in: self.view)
        print(location)
    }
}

ИЗМЕНИТЬ, Мой плохой, не отвечающий на ваш вопрос, имел ту же проблему, и кто-то связал меня с этим предыдущим ответом :

В любом случае мне пришлось изменить несколько вещей, чтобы заставить его работать в swift 3, вот мой текущий код:

var fingers = [String?](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] = String(format: "%p", 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 == String(format: "%p", 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 == String(format: "%p", touch) {
                fingers[index] = nil
                break
            }
        }
    }
}

У меня все еще есть небольшая проблема, но Я думаю, что это связано с моим GestureRecognizer в моем коде. Но это должно сделать трюк. Он будет печатать вам координаты каждой точки в консоли.

0
ответ дан Hawkydoky 23 August 2018 в 00:17
поделиться
  • 1
    Если кто-то может подтвердить, что это работает, я буду отмечать это как ответ – Fr4nc3sc0NL 29 June 2017 в 01:57
  • 2
    @ Fr4nc3sc0NL Отредактировал свой ответ, чтобы сделать его правильным. – Hawkydoky 29 June 2017 в 07:25

В Swift 3,4 Определите указатель касания по его хешу:

// SmallDraw
func pointerHashFromTouch(_ touch:UITouch) -> Int {
    return Unmanaged.passUnretained(touch).toOpaque().hashValue
} 
0
ответ дан SmallDraw 23 August 2018 в 00:17
поделиться