Images bewegen

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

  • Images bewegen

    Ich arbeite in Augenblick an einem kleinen Problem und komme einfach nicht weiter.

    Auch meine Suche bei YouTube und Google haben bisher nichts gebracht :(

    Folgendes:

    von einer SubView (ScrollView = meine Bibliothek) werden per Button Bilder(Symbole) auf die Hauptview plaziert.

    Dieses Image kann ich dann frei bewegen, klappt alles soweit ganz gut.

    Weiterhin kann ich weitere Symbole auf der Hauptview plazieren.
    ABER ich kann nur immer das letzte plazierte Symbol bewegen.

    Wie kann ich die anderen Symbole wieder aktiv machen um diese dann auch noch mal bewegen zu können ?
    Evtl. mit "TouchUpInside" oder ähnlichem.

    Es wird immer nur ein, das aktive Symbol (Image) bewegt.

    In den Tutorials die ich bisher gesehen/gelesen habe werden auch mehrere Images bewegt ABER die Anzahl der Images steht im Vorfeld fest und werden im IB plaziert.

    Meine Images werden programatisch erzeugt und können beliebig viele sein.
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • hier der code zum bewegen der images

    Quellcode

    1. -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    2. UITouch *touch = [[event allTouches] anyObject];
    3. CGPoint location = [touch locationInView:self.view];
    4. int imageX = images.frame.origin.x;
    5. int imageY = images.frame.origin.y;
    6. int imageW = images.frame.size.width;
    7. int imageH = images.frame.size.height;
    8. int verFaktor = 100/faktor;
    9. UIImageView *imageGross = [[UIImageView alloc] initWithFrame:CGRectMake(imageX-(2*verFaktor), imageY-(2*verFaktor), imageW+(4*verFaktor), imageH+(4*verFaktor))];
    10. if (CGRectContainsPoint([imageGross frame], location)) {
    11. images.center = location;
    12. }
    13. [imageGross release];
    14. }
    Alles anzeigen
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • und noch nen bissl

    Quellcode

    1. -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    2. UITouch *touch = [[event allTouches] anyObject];
    3. CGPoint location = [touch locationInView:self.view];
    4. images.center = location;
    5. }
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • Das Image wird bewegt.

    Das funktioniert ja auch.

    Die Werte von "Images" werden an "imageGross übergeben.


    Das "imageGross" ist nur dafür da um die "touch" Fläche etwas zu vergrößern.
    deswegen wird es ja anschließend auch gleich release.

    Bewegt wird ja das "images".

    images.center = location;


    ok, ich sehe schon die richtige Bezeichnung zu finden, da muss ich noch dran arbeiten......
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • Was ist denn images, laut code würde ich vermuten, dass es ein einzelnes Image ist. Wenn Du jetzt ein anderes - bereits eingefügtes - Bild bewegen willst, dann musst Du in deinem View eine Möglichkeit schaffen dieses Image wieder zum aktiven Image (also dem Image in images) zu machen. Der einfachste Ansatz dürfte dabei sein dass Du eine liste aller eingefügten Images im view hälst - was du evtl. ja schon tust - und deinem View einen Selektionsmechanismus hinzufügst (z.B. touch auf ein eigefügtes Image reaktiviert es), wobei du dir natürlich Gedanken machen musst wie Du mit Auswahlkonflikten - Touch Position liegt auf mehreren Bildern - umgehst.
  • BTW: Du erzeugst einen neuen UIImageView, um dann nur den frame bzw. das CGRect des ImageViews für eine Abfrage zu verwenden? Warum verwendest Du dann nicht gleich einfach einen CGRect? Z.B. so:

    Quellcode

    1. CGRect imageRect = CGRectMake(imageX-(2*verFaktor), imageY-(2*verFaktor), imageW+(4*verFaktor), imageH+(4*verFaktor));
    2. if (CGRectContainsPoint(imageRect, location)) {
    3. images.center = location;
    4. }
  • Snoxxi schrieb:

    Was ist denn images, laut code würde ich vermuten, dass es ein einzelnes Image ist. Wenn Du jetzt ein anderes - bereits eingefügtes - Bild bewegen willst, dann musst Du in deinem View eine Möglichkeit schaffen dieses Image wieder zum aktiven Image (also dem Image in images) zu machen. Der einfachste Ansatz dürfte dabei sein dass Du eine liste aller eingefügten Images im view hälst - was du evtl. ja schon tust - und deinem View einen Selektionsmechanismus hinzufügst (z.B. touch auf ein eigefügtes Image reaktiviert es), wobei du dir natürlich Gedanken machen musst wie Du mit Auswahlkonflikten - Touch Position liegt auf mehreren Bildern - umgehst.
    also beim auswählen aus meiner bibliothek wird das UIImageview "images" erstellt und ein Bild zugewiesen. Das images wird auch einem zusätzlichem in einem MutibleArray gespeichert.

    Meine Frage ist ja nun wie ich das am besten Speichere das ich die "alten" images wieder aktiv machen kann. Bzw. wie ich wieder darauf zurückgreifen kann.

    Mit Auswahlkonflikten, wenn zwei Objekte übereinander liegen, habe ich mir auch schon gedanken gemacht, da wird das obere genommen.......darum will ich mich dann kümmern wenn mein aktuelles Problem gelöst ist. ;) eins nach dem anderen.......
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • hier noch mein code zum plazieren der bilder:

    messestandItems = MutibleArray

    Quellcode

    1. -(void)aMethod:(id)sender{
    2. UIButton *button = sender;
    3. int y = 0;
    4. for (int x=1; x<=ANZAHL_WAND; x++) {
    5. NSString *frameString = [NSString stringWithFormat:@"{{0, %i}, {100, 100}}", y];
    6. if ([NSStringFromCGRect(button.frame) isEqualToString:frameString]) {
    7. images = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"s_Wand%i.png", x]]];
    8. // Bildgröße berechnen, anhand "faktor"
    9. int imageX = images.frame.size.height * faktor/100;
    10. int imageY = images.frame.size.width * faktor/100;
    11. images.frame = CGRectMake(420, 200, imageY, imageX);
    12. images.tag = standObjektAnzahl;
    13. images.userInteractionEnabled = YES;
    14. images.multipleTouchEnabled = YES;
    15. [objekte addSubview:images];
    16. NSLog(@"Items Zähler: %i", standObjektAnzahl);
    17. NSMutableArray *itemDS = [[NSMutableArray alloc] init];
    18. [itemDS addObject:[NSString stringWithFormat:@"%i", standObjektAnzahl]];
    19. [itemDS addObject:[NSString stringWithFormat:@"s_Wand%i.png", x]];
    20. [itemDS addObject:[NSString stringWithFormat:@"%i", imageX]];
    21. [itemDS addObject:[NSString stringWithFormat:@"%i", imageY]];
    22. [itemDS addObject:[NSString stringWithFormat:@"420"]];
    23. [itemDS addObject:[NSString stringWithFormat:@"200"]];
    24. [messestandItems addObject:itemDS];
    25. NSLog(@"Count: %i", messestandItems.count);
    26. [itemDS release];
    27. [images release];
    28. }
    29. y= y+100;
    30. }
    31. }
    Alles anzeigen
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • Na, dann mach doch einfach folgendes wenn du einen einfachen Touch bekommst, dann nimmst Du die Position dieses Events und läufst über alle Images in deinem Array bis Du das Image findest für das die Eventkoordinate innerhalb des Image frames liegt und das den höchsten "Z-Index" hat also am weitesten vorne liegt. Als Z-Index liese sich dabei z.B. der Index in deinem Array verwenden.
  • Snoxxi schrieb:

    Na, dann mach doch einfach folgendes wenn du einen einfachen Touch bekommst, dann nimmst Du die Position dieses Events und läufst über alle Images in deinem Array bis Du das Image findest für das die Eventkoordinate innerhalb des Image frames liegt und das den höchsten "Z-Index" hat also am weitesten vorne liegt. Als Z-Index liese sich dabei z.B. der Index in deinem Array verwenden.
    ich habe inzwischen einen interessanten Thread gefunden [url]http://stackoverflow.com/questions/13378972/use-array-for-images?answertab=votes#tab-top[/url]

    Da werde ich mal rum experimentieren.....evtl. kriege ich da hin welches bild berührt wird und dann das bewegen.....
    Wenn Dich alles verlässt kommt das allein sein.
    Wenn Du alles verlässt kommt die Einsamkeit.
  • Das Problem welches Du hast ist, dass Du dir in deinem itemDS nur die initiale Position merkst und nicht die Position an der das Bild nach evtl. Verschiebungen liegt. Statt dieser ganzen Informationen kannst Du auch einfach das images selbst hinzufügen.

    Anstelle von

    Quellcode

    1. NSMutableArray *itemDS = [[NSMutableArray alloc] init];
    2. [itemDS addObject:[NSString stringWithFormat:@"%i", standObjektAnzahl]];
    3. [itemDS addObject:[NSString stringWithFormat:@"s_Wand%i.png", x]];
    4. [itemDS addObject:images];


    würde ich aber auch eher

    Quellcode

    1. NSDictionary * item = @{
    2. @"Number" : standObjectAnzahl,
    3. @"Filename" : [NSString stringWithFormat:@"s_Wand%i.png", x],
    4. @"View" : images
    5. };


    verwenden. Als Minimum würde ich mir aber bei deiner Lösung enums o.Ä. definieren und über diese auf den passenden Index zugreifen. Alles andere ist in meinen Augen sehr fragil. Ach und images würde ich in activeImageView o.Ä. umbenennen.
  • Svennse schrieb:

    Snoxxi schrieb:

    Na, dann mach doch einfach folgendes wenn du einen einfachen Touch bekommst, dann nimmst Du die Position dieses Events und läufst über alle Images in deinem Array bis Du das Image findest für das die Eventkoordinate innerhalb des Image frames liegt und das den höchsten "Z-Index" hat also am weitesten vorne liegt. Als Z-Index liese sich dabei z.B. der Index in deinem Array verwenden.
    ich habe inzwischen einen interessanten Thread gefunden [url]http://stackoverflow.com/questions/13378972/use-array-for-images?answertab=votes#tab-top[/url]

    Da werde ich mal rum experimentieren.....evtl. kriege ich da hin welches bild berührt wird und dann das bewegen.....
    Damit wirst Du nicht weit kommen, weil wenn alle Bilder übereinander liegen, RectIntersect bei jedem Image zutrifft.
    Oder hab ich Dein grundsätzliche Problem nicht richtig verstanden?
  • Ein Dictionary würde ich nicht nehmen da es keine definierte Reihenfolge hat und die brauchst du hier um den Z-Index zu bestimmen.

    Pack die ImageViews in ein Array und benutze den Index als Z-Index. Das ist am effektivsten

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)