2010-01-02 13 views
8

Ziemlich häufig Frage, auf die ich ein paar Antworten habe und ich bin fast da. Ich habe eine Schaltfläche, die, wenn sie gedrückt, wird ein Bild (Code wie folgt) erstellenUImage erkennen und berühren

(NumImages auf Last auf Null gesetzt und wird als Hochzählen für die Tag-Nummern aller Bilder erstellt verwendet)

UIImage *tmpImage = [[UIImage imageNamed:[NSString stringWithFormat:@"%i.png", sender.tag]] retain]; 
UIImageView *myImage = [[UIImageView alloc] initWithImage:tmpImage]; 

numImages += 1; 

myImage.userInteractionEnabled = YES; 
myImage.tag = numImages; 
myImage.opaque = YES; 
[self.view addSubview:myImage]; 
[myImage release]; 

Ich habe dann eine touchesBegan-Methode, die erkennt, was berührt wurde. Was ich tun muss, ist, dass der Benutzer das neu erstellte Bild ziehen kann. Es funktioniert fast, aber das Bild flackert überall, wenn Sie es ziehen. Ich kann auf das Bild, auf das Sie klicken, zugreifen, da ich es TAG bekommen kann, aber ich kann es einfach nicht schön ziehen.

Es funktioniert, in dem ich eine Ausgabe des Tags für jedes Bild erhalte, während ich auf sie klicke. Aber wenn ich ziehe, blinkt es ... irgendwelche Ideen?

Antwort

34

Als Antwort auf meine eigene Frage - ich entschied mich, eine Klasse für die Handhabung der Bilder zu erstellen, die ich auf der Ansicht platziere.

-Code, wenn jemand interessiert ....

Draggable.h

#import <Foundation/Foundation.h> 
@interface Draggable : UIImageView { 
    CGPoint startLocation; 
} 
@end 

Draggable.m

#import "Draggable.h" 
@implementation Draggable 

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    // Retrieve the touch point 
    CGPoint pt = [[touches anyObject] locationInView:self]; 
    startLocation = pt; 
    [[self superview] bringSubviewToFront:self]; 
} 
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
    // Move relative to the original touch point 
    CGPoint pt = [[touches anyObject] locationInView:self]; 
    CGRect frame = [self frame]; 
    frame.origin.x += pt.x - startLocation.x; 
    frame.origin.y += pt.y - startLocation.y; 
    [self setFrame:frame]; 
} 
@end 

und es zu nennen

UIImage *tmpImage = [[UIImage imageNamed:"test.png"] retain]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:tmpImage]; 

CGRect cellRectangle; 
cellRectangle = CGRectMake(0,0,tmpImage.size.width ,tmpImage.size.height); 
UIImageView *dragger = [[Draggable alloc] initWithFrame:cellRectangle]; 
[dragger setImage:tmpImage]; 
[dragger setUserInteractionEnabled:YES]; 

[self.view addSubview:dragger]; 
[imageView release]; 
[tmpImage release]; 
+4

der Code oben kommt von http://www.iphoneexamples.com/ –

+0

Danke für das Posten, aber ich bekomme Jitter-Effekt dabei, wie es vermieden werden kann? – itsaboutcode

+0

danke mann! Arbeiten wie ein Charme :) – soupdiver

1

Normalerweise erhalten Sie eine implizite Animation, wenn Sie center ändern. Tust du zufällig -contentMode oder rufst du -setNeedsDisplay an?

Sie können explizit Animation fordern Sie die löschen und neu zeichnen diese Weise zu vermeiden:

if (touch.view.tag > 0) { 
    [UIView beginAnimations:@"viewMove" context:touch.view]; 
    touch.view.center = location; 
    [UIView commitAnimations]; 
} 

Sie beachten Sie, dass NSLog() sehr langsam sein kann (viel langsamer als man erwarten würde, es ist viel komplizierter, als ein einfach printf), und das kann Probleme verursachen in so oft wie touchesMoved:withEvent: aufgerufen werden.

BTW, du leckest tmpImage.

+0

danke für die Antwort . Ich habe versucht, was Sie vorgeschlagen haben und es passiert immer noch. Ich denke, dass es etwas mit dem Code zu tun hat, den ich verwende, um das Bild zu setzen? Wenn ich ein Bild auf die Ansicht in Interface Builder platziere und dies als IBOutlet UIImageView in der .h-Datei einstelle, bewegt sich das perfekt. Fehle ich etwas beim Einrichten jedes meiner Bilder? (ps) danke für den tmpImage tip - das habe ich verpasst! –

+0

Ich dachte, es könnte ein Problem mit dem Tag sein .. aber jetzt denke ich, es könnte ein Problem mit den Ansichten sein. Wenn ich das Bild mit dem ersten Bit Code platziere, geht es auf 0,0. Es scheint immer dahin zu sein, wenn ich es zurück ziehe. Das verursacht das Flackern. Die aktuelle Position, dann bewegt es sich zurück ... es macht mich verrückt! –

Verwandte Themen