UIImageViews erstellen und bewegen

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

  • UIImageViews erstellen und bewegen

    Hallo alle zusammen,
    in einem kleinen Projekt möchte ich gerne UIImageViews erstellen und diese anschließend mittels UITouch bewegen können.

    Genauer gesagt: Man Tippt auf einen Button, dieser erstellt eine UIImageView, welches dann bewegt werden kann. Wichtig ist, dass man beliebig oft auf den Button tippen kann.

    Mit meinem Code kann allerdings nur das zuletzt hinzugefügte UIImageView bewegt werden, aber nicht mehr die älteren.
    Mir ist klar, dass ich die UIImageViews in ein Array packen muss und dann irgendwie benennen, damit diese auch immer bekannt bleiben. Aber wie ?

    Hier mein bisheriger Code:

    h.

    Quellcode

    1. ​@interface ViewController : UIViewController {
    2. NSMutableArray *ImgArray;
    3. UIImageView *ImgView;
    4. }
    5. -(IBAction)add:(id)sender;
    6. @property (nonatomic,retain) UIImageView *ImgView;
    7. @end
    Alles anzeigen




    .m

    Quellcode

    1. ​-(IBAction)add:(id)sender {
    2. ImgArray = [[NSMutableArray alloc] init];
    3. ImgView = [[UIImageView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
    4. [ImgView setImage:[UIImage imageNamed:@"test.png"]];
    5. ImgView.userInteractionEnabled = YES;
    6. [ImgArray addObject:ImgView];
    7. [self.view addSubview:ImgView];
    8. }
    9. -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    10. {
    11. UITouch *touch = [[event allTouches] anyObject];
    12. if([touch view]==self.ImgView)
    13. {
    14. CGPoint location = [touch locationInView:self.view];
    15. self.ImgView.center=location;
    16. }
    17. }
    Alles anzeigen
  • Wenn Du ein Array verwenden möchtest, solltest Du es in einer starken Property ablegen. Eine lokale Variable hilft Dir da wenig.

    Alternativ kannst Du auch über die Subviews von self.view (also self.view.subviews) beim Verschieben iterieren.

    BTW: Allerdings solltest Du dann mit relativen Werten beim Verschieben arbeiten. Ansonsten klumpen Deine Bilder auf einem Punkt zusammen. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • Okay das macht durchaus Sinn ! Danke !

    Allerdings bleibt das Problem, dass die touchesMoved Methode ja nicht weiß, welches UIImageView man gerade antippt, außer dem zuletzt erstellten. Ich muss die also irgendwie automatisch benennen und der Methode mitteilen, welches View welchen Namen hat.
    Oder habe ich einen ganz falschen Ansatz ?
  • Jepp, benennen brauchst Du da nichts. In touchesBegan:withEvent: ermitteln ob und wenn ja welches ImageView beim Touch getroffen wurde. Dieses merkst Du Dir dann einfach als aktives ImageView.

    In touchesMoved:withEvent: kannst Du das aktive ImageView, falls vorhanden, dann entsprechend verschieben.
  • Das aktive ImageView auf nil setzen.

    In touchesBegan:withEvent: die locationInView: ermitteln.

    Dann per self.view.subviews.reverseObjectEnumerator über die ImageViews iterieren und schauen, ob die ermittelte Touch Location ein ImageView "getroffen" hat.

    Ist dies der Fall, dann dieses ImageView als aktives ImageView merken und die Enumeration verlassen.

    In touchesMoved:withEvent: kannst Du das aktive ImageView, falls vorhanden, dann entsprechend verschieben.