Kollisionserkennung mit UIButtons

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Kollisionserkennung mit UIButtons

    Moin zusammen,

    es geht um folgendes Szenario: In einer ScrollView mit einer recht großen ContentSize lassen sich UIButtons (bzw. davon abgeleitete Klassen) erstellen und verschieben. Den Buttons wird dazu ein UIPanGestureRecognizer zugewiesen, der dann bei der Berührung bzw. bei jedem "Positionswechsel" ein Event feuert und dem Button die neuen Koordinaten zuweist.

    Wie kann ich nun verhindern, dass mehrere Buttons übereinander geschoben werden?
  • Das Problem hatte ich mal auch mal. ich weiß aber nicht, ob das besser lösen könnte, wenn ja wäre ich über ein Tipp dankbar:
    Ich habe mir die Koordinaten der anderen Buttons in ein Dictionary gespeichert. Als Key war "x" und als Value "y". Nun habe ich eine For-Schleife genommen und habe alle 10px vom Anfangspunkt bis Endpunkt des Buttons das Dictionarry abgefragt, ob schon ein Wert mit diesen X-Wert vorhanden war. Somit wusste ich, dass nie ein Button über einander geschoben wurde. Das ging erstaunlicherweise auch fix und es ruckelt nichts.

    Edit:
    @wolf Danke! Das ist natürlich eine bessere Variante.
  • Danke schon mal für die Antworten! Ich suche halt auch nach ner performanten Lösung.
    Wenn die contentSize meiner ScrollView z.B. 2000x2000 betragt und 200 Butons enthält, brauch ich ja nicht immer über alle 200 Buttons zu laufen, wenn die Hälfte davon z.B. unten rechts sitzt und ich oben links etwas verschiebe :rolleyes:
  • Brauchst du ja nicht, du musst nur eben nur die X-Werte abfragen. Wenn dein Button bei x=400 anfängt und bei x=450 aufhört. Muss eben die Schleife 5 mal durchlaufen werden. Ich denke das geht noch.

    Die andere Variante von @Wolf ist da bei deinen Fall glaube ich aufwendiger, wie man hier sieht: stackoverflow.com/a/6159146

    Edit: Das was ich geschrieben habe kann nicht funktionieren. Ich schau noch mal.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von AppleDeveloper ()

  • AppleDeveloper schrieb:

    Brauchst du ja nicht, du musst nur eben nur die X-Werte abfragen. Wenn dein Button bei x=400 anfängt und bei x=450 aufhört. Muss eben die Schleife 5 mal durchlaufen werden. Ich denke das geht noch.

    Die andere Variante von @Wolf ist da bei deinen Fall glaube ich aufwendiger, wie man hier sieht: stackoverflow.com/a/6159146

    Edit: Das was ich geschrieben habe kann nicht funktionieren. Ich schau noch mal.


    Bei so vielen Buttons würd ich das auch anders machen, ich würd den großen View in ein Grid unterteilen und die Buttons je nachdem wo sie im Grid liegen in eine Map einsortieren, somit lässt sich der Kollisionsaufwand auf ein Minimum beschränken.
    Wobei 200 Buttons sau viel sind, ich denk mal früher oder später wirst Du sowieso merken, dass das ganze sehr langsam wird, auch ohne die Kollisionserkennung.
  • Stell dir einfach ein Gitter vor von sagen wir 2x2 wie ein Karopapier, die Buttons liegen in einem dieser Raster (um es erst mal einfach zu machen, natürlich gibt es welche die in mehreren liegen können).
    Dann merkst du sehr schnell, das ein Button nur mit nem anderen kollidieren kann, wenn sie beide im selben Raster liegen.
    Nur so als Denkanstoß
  • Hi,

    wenn du an der Performance optimieren willst, wuerde ich sagen, du musst dir erst mal ueberlegen wie du das nicht mit 200 Buttons machst.

    Im Vergleich zu dem was 200 Buttons an Rechenleistung brauchen, ist der Hittest ein Witz. Du muesstest einfach schauen, ob der Button, der gerade Bewegt wird sich mit dem Frame eines der restlichen 199 Buttons ueberschneidet - das ist quasi nichts. Da kannst du auch noch optimieren, wenn Instruments sagt, das du optimieren musst.

    Aber mit 200 Subviews faehrst du garantiert an die Wand.

    Gruss
    Manfred
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • 200 war jetzt einfach eine fiktive Zahl. Es können auch nur 50 sein. Aber den Performancetest muss ich natürlich noch durchführen, da werde ich dann natürlich drauf achten!

    Ich werde am Wochenende mal den Vorschlag von wolf_10de aufgreifen und die Buttons nach ihrer Position sortieren um dann ne Kollisionsabfrage machen zu können.