Tap Gesture & welches ImageView

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

  • Tap Gesture & welches ImageView

    Hi Leute,
    ich steh grad auf der Leitung.

    ich habe folgendes Problem.
    In können verschiedene Bilder platziert und verschoben werden werden. Verschoben wird immer das letzte Aktive Image [aktivImage ( UIImageView)].
    Um ein anderes Image auch zu einem späteren Zeitpunkt zu verschieben muss dieses auch wieder aktiviert werden.

    Die einzelnen Images werden in einem Array gespeichert.

    Ich habe das so gelöst das ich mit "touschesBegin" und "touchesEnded" der Punkt festgelegt wird wo der Bildschirm berührt wird und in der Methode
    "touchesEnded" wird dann dieser Punkt verglichen ob an der Stelle ein Image liegt.

    Quellcode

    1. -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    2. [self buttonVerschwinden];
    3. [self zuklappen];
    4. UITouch *touch = [[event allTouches] anyObject];
    5. locationBegin = [touch locationInView:self.view];
    6. }
    7. -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    8. [self zuklappen];
    9. UITouch *touch = [[event allTouches] anyObject];
    10. //CGPoint location = [touch locationInView:self.view];
    11. locationEnd = [touch locationInView:self.view];
    12. int x = locationBegin.x;
    13. int y = locationBegin.y;
    14. CGRect touchBegin = CGRectMake(x-5, y-5, 10, 10);
    15. if (CGRectContainsPoint(touchBegin, locationEnd)) {
    16. for (int i = 2; i < [itemTest count]; i++) {
    17. UIImageView *imageView = [itemTest objectAtIndex:i];
    18. if (CGRectContainsPoint(CGRectMake(imageView.frame.origin.x, imageView.frame.origin.y, imageView.frame.size.width, imageView.frame.size.height),locationEnd)) {
    19. nextImageView = [itemTest objectAtIndex:i];
    20. aktivItemID = i;
    21. [self aktivateIcon];
    22. return;
    23. } else {
    24. [self buttonVerschwinden];
    25. }
    26. }
    27. } else {
    28. [self buttonVerschwinden];
    29. }
    30. }
    Alles anzeigen


    Wenn erkannt wird das an der Stelle an der "getouched" wird ein Objekt liegt werden um dieses Objekt ein paar Button aktiviert.
    Mit einem Button kann das dieses Image als aktives Image aktiviert werden um dann das weiter zu verschieben, drehen usw,
    Da ja noch nicht sicher ist ob der Benutzer mit dem Image arbeiten will oder doch mit dem noch aktiven weiter arbeiten will wird das "getouched" Image als "nextImageView" zwischengespeichert.
    Und erst wenn der "Aktivieren" Button geklickt wird wird das nextImage an aktivImage übergeben.

    Bisher hat alles ohne Probleme funktioniert.

    Nun habe ich PinchGesture und PanGesture mit implementiert und da fangen meine Probleme an.
    Im gezoomten und verschobenen Zustand des View's stimmt der Punkt an dem "getouched" wird ja nicht mehr mit dem Punkt überein an dem das Image liegt.

    Das Problem ist ja das nun ein Image/Objekt das im View z.B.: an der Position Center = 100.100 liegt bei pinch und lan dann möglicherweise an der Bildschirmposition 200.200 liegen kann.
    wenn ich an diese Stelle touche passiert.......nix. Eigentlich ja auch logisch weil ja als touch Punkt 200.200 ermittelt wird. Das Image aber ja immer noch an der Position 100.100 liegt im View.

    Ich bin nun am Überlegen moved/ended durch eine TapGesture zu ersetzen aber wie kann ich dann ermitteln welches Image aus dem Array getouched wird.
    Ich will ja berücksichtigen das dieses Objekt als nächstes Aktiviert werden kann........

    Quellcode

    1. -(void)aktivItem:(id)sender {
    2. [self buttonVerschwinden];
    3. snap = (int) nextImageView.tag;
    4. aktivImageView = nextImageView;
    5. }


    Ich hoffe mal ich konnte mich verständlich ausdrücken......
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • ioscampus schrieb:

    Ich glaube du suchst so etwas wie convertPoint:toView:

    Wobei das Hauptproblem eher sein dürfte, die richtige View als Bezugsgröße zu finden ... denn mit "locationInView:" lässt sich ja auch ohne explizitem "convertPointToView:" eine Umrechnung der Touch-Koordinaten in ein anderes System erreichen. Ich nutze z. B. bei einer in eine Scrollview eingebetteten View den folgenden Code, um die Touch-Koordinaten im System der enthaltenen View zu erhalten:

    Quellcode

    1. ​CGPoint tapLocation = [gesture locationInView:[[self scrollView] contentView]];

    Da muss man eben etwas über die View-Hierarchie knobeln und vielleicht mal testweise ein paar Koordinaten ausgeben lassen ... :)

    HTH, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • ioscampus schrieb:

    Ich glaube du suchst so etwas wie convertPoint:toView:


    ioscampus, vielen Dank :)

    Du hast mir zumindest einen Weg aufgezeigt und bei meiner GoogleSuche nach einer Lösung bin ich dann zufällig auf ein viel einfachere Lösung gekommen.

    Natürlich habe ich mir den "Fehler" selber eingebaut.

    Hier meine Denkfehler und meine Lösung.

    Ich habe ja in meinen Methoden "touchesBegin" & "touchesEnded" die Punkte abgefragt wo der Bildschirm berührt wird

    Quellcode

    1. locationBegin = [touch locationInView:self.view];


    und genau hier liegt der Fehler.........
    Mein self.View bringt ja immer die Koordinaten an denen berührt wird. Diese sind von meiner SuperView.
    Da ich ja aber meine "grundrasterView" gepincht habe stimmen die Punkte nicht mehr überrein.

    Ich muss natürlich den Berührungspunkt von meiner grundrasterView abfrage ;)

    Quellcode

    1. locationBegin = [touch locationInView:grundraster];
    2. .
    3. .
    4. .
    5. .
    6. locationEnd = [touch locationInView:grundraster];


    somit werden die Berührungspunkte von der vergrößerten (Pinch) View abgefragt und nun stimmt auch alles wider, und funktioniert auch alles :D
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.