2016-09-29 10 views
9

Jak mogę wykryć kolizję na patelni z UIDynamicItem?Dynamiczne zachowanie UIKit z załącznikiem bez zachowania kolizji?

Tło: Generuję 20 etykiet losowo z zestawu kolorów/ciągów (ta część nie jest istotna dla pytania), a następnie dodaje je do głównego widoku z losową pozycją środkową. Stamtąd, dodaję UIDynamicBehavior s, co następuje:

1) UIDynamicItemBehavior zatrzymać etykiety obracaniu 2) UISnapBehavior przystawki etykiet do centrum widoku (Chcę ruch grawitacji jak, ale znowu, to nie jest to pytanie) 3) UICollisionBehavior dla wszystkich etykiet, gdzie collisionMode jest .Items.

To działa w "początkowej" konfiguracji ... wszystkie etykiety pojawiają się w przypadkowych miejscach, a następnie szybko przyciągają się w środku, z właściwym wykrywaniem kolizji. Moje pytanie brzmi jednak: jak mogę przesunąć etykietę (poprzez gest pan), aby wykrywanie kolizji było kontynuowane?

Mam ustawienia UIPanGestureRecognizer na każdej z etykiet, a kiedy zaczną przeciągać, utworzę UIAttachmentBehavior i używam tego do przesuwania ich podczas przeciągania. To "działa" w tym sensie, że etykieta się porusza, ale po prostu ślizga się po wszystkich innych etykietach bez wykrycia kolizji. Jak mogę osiągnąć to wykrywanie kolizji, tak, że kiedy zaczynam przeciągać jedną etykietę w kierunku innych, one znikają z drogi tylko na tyle, by nie zachodziły na siebie (a potem te przyciągają się do swoich pozycji w oparciu o punkt środkowej grawitacji) ? Czy muszę dołączyć UIAttachmentBehavior do wszystkich innych etykiet do tej, którą przeciągam dla każdej z patelni?

Utworzyłem projekt testowy dla emisji ja licowa, prezentuje to, co właśnie opisano:

github test project

Dzięki!

Odpowiedz

0

Po kilku miesiącach rozważań nad tym zagadnieniem, w końcu pomyślałem o rozwiązaniu, więc pomyślałem, że później opublikuję to tutaj dla dobra wszystkich.

Jest to bardzo łatwe do osiągnięcia dzięki prostej scenie SpriteKit. Po prostu utworzę małą scenę z dowolnym tekstem/kolorem/rozmiarem, którą chcę, a następnie dodaję SKFieldNode z . Stąd właściwości fizyki można odtwarzać za pomocą właściwości physicsBody każdego węzła i mogę osiągnąć dokładnie to, co było pożądane, podłączając się do metody touchesBegan sceny i odpowiednio przesuwając odpowiedni węzeł, z silnikiem fizyki zajmującym się kolizjami i odbijaniem dla mnie.