2017-03-21 5 views
1

Meine Ansicht Hierarchie folgt:UIPanGestureRecognizer wird nicht gestartet. Swift 3

  • Ansicht

    • Ansicht Für Benutzerhandbuch Img + Emoji (A)
    • Ansicht mit UI-Elemente. (B)

In viewDidLoad schaffe ich UIImageViews für Emojis, fügen sie dem A und fügen Geste Erkenner (pan, klemme, drehen):

let emojiView = UIImageView(image: emoji) 
      emojiView.tag = n 
      emojiView.frame = CGRect(x: 153, y: 299, width: 70, height: 70) 
      emojiView.isUserInteractionEnabled = true 

      let pan = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(recognizer:))) 
      pan.delegate = self 
      emojiView.addGestureRecognizer(pan) 

      let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.handlePinch(recognizer:))) 
      pinch.delegate = self 
      emojiView.addGestureRecognizer(pinch) 

      let rotate = UIRotationGestureRecognizer(target: self, action: #selector(self.handleRotate(recognizer:))) 
      rotate.delegate = self 
      emojiView.addGestureRecognizer(rotate) 

Später erkläre ich IBActions :

@IBAction func handlePan(recognizer: UIPanGestureRecognizer) { 
    let translation = recognizer.translation(in: self.viewForImgAndEmoji) 
    if let view = recognizer.view { 
     view.center = CGPoint(x:view.center.x + translation.x, 
           y:view.center.y + translation.y) 
    } 
    recognizer.setTranslation(CGPoint.zero, in: self.viewForImgAndEmoji) 
} 

@IBAction func handlePinch(recognizer: UIPinchGestureRecognizer) { 

    let pinchPoint = recognizer.location(in: viewForImgAndEmoji) 
    let ourEmojiView = viewForImgAndEmoji.hitTest(pinchPoint, with: nil) 

    ourEmojiView!.transform = ourEmojiView!.transform.scaledBy(x: recognizer.scale, y: recognizer.scale) 
    recognizer.scale = 1 

} 

@IBAction func handleRotate(recognizer: UIRotationGestureRecognizer){ 

    let rotatePoint = recognizer.location(in: viewForImgAndEmoji) 
    let ourEmojiView = viewForImgAndEmoji.hitTest(rotatePoint, with: nil) 

    ourEmojiView!.transform = ourEmojiView!.transform.rotated(by: recognizer.rotation) 
    recognizer.rotation = 0 
} 

Problem: die Pfanne funktioniert nicht. Drehen und drücken funktioniert. Aber schwenken ist nicht. (kann nicht Interaktion mit dem Benutzer zum Umlegen Ansicht deaktivieren, da es Tasten hat)

+0

Ist es möglich, ein kleines Demo-Projekt mit dem Code zu bekommen? In solchen Situationen ist es einfacher, mit einem tatsächlichen Projekt zu debuggen, das das Szenario repliziert, da (abgesehen von etwas Einfachem, das übersehen wurde) eine andere Ansicht Ihre Schwenkbewegung verschlucken könnte. Oder Sie können versuchen, das Szenario mit einer einzigen eigenen Ansicht zu replizieren (anstelle mehrerer überlagerter Ansichten) und festzustellen, ob das Problem weiterhin auftritt ... – Fahim

+0

https://github.com/flostik2008/Skirt Datei EmojiVC.swift . Vielen Dank. – Evgeny

+1

Werfen Sie einen Blick jetzt. Ich melde mich bei dir, sobald ich entdecke, was vor sich geht. – Fahim

Antwort

1

OK, ich habe einen Blick auf den Code, und ich sehe zwei Mögliche Probleme:

1: Sie haben Gestenerkennung, Pinch, Pan und Rotate im Storyboard. Diese könnten überflüssig sein. Erwähnen Sie das nur. Dies ist jedoch nicht das Problem, das Pan Gestenerkenner funktioniert nicht.

2: Die UIView für Steuerelemente deckt Ihre Emoji und Bildansicht und übernimmt Berührungen. Sie benötigen keine Vollbildansicht für die UI-Steuerelemente, da Sie nichts mit der Ansicht selbst zu tun haben. Stattdessen können Sie einfach den Knopf an der richtigen Stelle auf dem Hauptbildschirm über die viewForImgAndEmoji setzen. Auf diese Weise erreichen alle Bildschirmberührungen viewForImgAndEmoji außer an den Stellen, wo Sie die Tasten haben.

Ich änderte das Storyboard auf diese Weise und ich konnte die Schwenkgesten an diesem Punkt gut bekommen. Lassen Sie mich wissen, wenn Sie mich brauchen, um etwas zu klären, da ich nicht sicher bin, ob ich über das Problem klar genug war :)

Hinweis: Ein Problem, das Sie bei der Behebung der oben genannten Probleme auftreten, ist, dass Sie feststellen, dass nicht alle Berührungen registriert werden, da der Gestenerkenner an jedem Aufkleber angebracht ist und der Aufkleber selbst möglicherweise zu klein ist, um etwas wie eine Pinch-Geste zu erkennen. Sie sollten besser viewForImgAndEmoji als Gesten-Handler hinzufügen und jeden Sticker/Emoji als Empfänger der Geste aktivieren, indem Sie das Emoji durch Antippen auswählen, bevor Sie versuchen, zu kneifen, zu drehen oder zu schwenken. Nur ein Vorschlag :)

+0

Nur um zu verdeutlichen, sollten die Buttons auf der Hauptansicht aber * oberhalb * der 'viewForImgAndEmoji' und nicht als Subviews von' viewForImgAndEmoji' gehen - so würden die Buttons in deinem fertigen Bild nicht erscheinen. – Fahim

+0

Es hat funktioniert. Ich habe auch viewForImgAndEmoji als Gesten-Handler registriert, da diese Ansicht aber auch das img des Benutzers enthielt, begann sie zusammen mit Emoji zu schwenken/zu kneifen/rotieren. Daher musste ich meine Ansichten neu strukturieren, um den Benutzern eine separate Ansicht zu geben. Es war einfach, denn nach Ihrer Erklärung in der vorherigen Frage verstehe ich jetzt, wie Ansichtshierarchie funktioniert (für meinen Fall). – Evgeny

+1

Gut zu hören, dass du Dinge zum Laufen bringen konntest und glücklich warst, etwas Hilfe geleistet zu haben :) Viel Glück mit der App und fühle mich frei, mich anzumachen, wenn du auf irgendwelche Probleme stößt! – Fahim

1

Unter Umständen müssen Sie die folgende Delegatmethode implementieren:

public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 
+0

ja, schon da. – Evgeny

Verwandte Themen