2010-12-11 19 views
1

Im Entwickeln eines Spiels, das Sie mit einem Puzzle vergleichen könnten, wo ich mehrere Spielkacheln haben, die auf einer Oberfläche (später als MainView bezeichnet) übereinstimmen werden. Zu Beginn des Spiels werden die Kacheln in einer IdleView unter der Hauptansicht platziert. Ich bewege die Fliesen mit der Schwenkbewegung. Ich wähle eine Kachel aus, indem ich die Tippgeste benutze, und schließlich muss ich in der Lage sein, die Kacheln zu drehen, die ich mit der Drehgeste mache. Dies verursachte einige Probleme, die ich lösen konnte, aber ich musste dann die Kacheln in einer UIScrollView platzieren, da ich zu viele habe, um sie alle auf einmal anzeigen zu können.Mehrere UIGestureRecognizer und UIScrollView verursachen Konflikte

Ich habe ein paar verschiedene Implementierungen gemacht und sie alle verursachten einige Probleme. Ich werde die verschiedenen Ansätze durchgehen, die ich versucht habe.

Ansatz 1. Pan, Tap -> Platten, Drehen -> Mainview

Zuerst habe ich die Tap-und pan-Erkenner im Spiel Kachel gesetzt und die drehen Geste in meinem Hauptansicht, weil die Fliesen zu klein sind, auszuführen Ich habe dann einen Konflikt bekommen, als ich versehentlich eine andere Kachel gedrückt hatte, als ich die Drehbewegung machte, und dann interpretierte diese Kachel sie als Schwenkbewegung. Dies führte dazu, dass ich einen neuen Ansatz versuchte.

Ansatz 2. Pan, Tippen, Drehen -> Mainview

Mein zweiter Ansatz war es, alle Gesten Erkenner in der Mainview zu setzen. Dann überprüfe ich jedes Mal, wenn eine Geste erkannt wird, ob eine Kachel an der Position für die Tap- und Pan-Gesten vorhanden ist, indem ich CGRectContainsPoint ([gameTile frame], geskePoint) aufruft;

Dann überprüfe ich für die Rotationsgeste, ob eine Kachel ausgewählt ist und rufe dann die entsprechenden Methoden auf. Das hat super funktioniert! Aber dann wurde mir klar, dass ich einen Mechanismus haben musste, um mehr Kacheln zu haben, die dann auf einem ganzen Bildschirm angezeigt werden können. Also habe ich ein UIScrollView hinzugefügt, wo ich die Kacheln horizontal platzierte, damit alle zugänglich sind. Ich habe unten eine kleine Zeichnung gemacht.

--------------------- 
|     | 
|     | 
|     | 
| Height 370 p | 
|     | 
|  MainView  | 
|     | 
|     | 
|     | 
|     | 
|     | 
|     | 
--------------------- 
|  Height 110 p | 
|  IdleView  | 
|  UIScrollView | 
|     | 
|     | 
--------------------- 

Ich habe dann die GameTiles als Subviews die Scrollview, so dass sie mit der Ansicht bewegen würde. Dann hörten sie nicht mehr auf meine Berührungen, da sie keine Unteransichten meiner MainView waren. Jetzt bin ich in einer Art Pattsituation, in der ich nicht mehr weiß, was ich tun soll. Ich kann die Kacheln verschieben, wenn ich zu Ansatz 1 zurückkehre und canCancelContentTouches = NO für UIScrollView setze. Aber dann habe ich wieder Probleme mit der Rotationsgeste und muss eine Kollisionserkennung durchführen, damit ich die Kachel vom Scrollview zur Mainview bewegen kann.

Ich habe viele verschiedene Beiträge zu diesem Thema gelesen, aber ich konnte noch keinen Sinn daraus machen.

Kann mir jemand auf einen anderen Weg ein paar Hinweise geben, dann ein UIScrollView, das mir erlaubt, 50 Kacheln zu haben, die nicht mit meinen Berührungen durcheinander kommen und trotzdem eine vernünftige Größe haben, damit ich Gestenerkennung verwenden kann . Oder wie man eine Kachel reibungslos von der UIScrollView auf die MainView verschiebt und trotzdem die Kacheln drehen kann, ohne andere Kacheln zu verschieben.

Antwort

1

Ich habe keine genaue Antwort auf Ihre Frage, aber diese Tipps helfen könnten:

  1. die Gestenereignisse fließen immer auf die am tiefsten verschachtelte Ansicht

  2. Sie können eine GestureRecognizer Unterklasse und überschreiben Sie die Methode "ignoreTouch: forEvent:", um Ereignisse bedingungslos zu ignorieren und Konflikte zu lösen.(Wie in Ihrem ersten Versuch - möchten Sie vielleicht Taps ignorieren, während die Drehung weitergeht)

I recently learned this stuff by watching the Apple WWDC videos referenced in this answer.

Das Gespräch verfügt über mehrere Objekte, die bewegt werden kann, skaliert und gedreht.

Apple example code for same

Verwandte Themen