2010-01-02 18 views
8

Bastante común pregunta esto, a lo que tengo algunas respuestas y estoy casi allí. Tengo un botón que al pulsarlo, se creará una imagen (código de la siguiente manera)UII detección de contacto táctil y arrastre

(numImages se establece en la carga a cero y se utiliza como un recuento para los números de las marcas de todas las imágenes creadas)

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]; 

Luego tengo un método touchesBegan que detectará lo que se toca. Lo que necesito hacer es permitir que el usuario arrastre la imagen recién creada. Está casi funcionando, pero la imagen parpadea por todas partes cuando la arrastra. Puedo acceder a la imagen en la que haces clic ya que puedo obtener su TAG, pero no puedo arrastrarlo bien.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 

    if (touch.view.tag > 0) { 
     touch.view.center = location; 
    } 

    NSLog(@"tag=%@", [NSString stringWithFormat:@"%i", touch.view.tag]); 

} 

- (void) touchesMoved:(NSSet *)touches withEvent: (UIEvent *)event { 
    [self touchesBegan:touches withEvent:event]; 
} 

Funciona, ya que obtengo una salida de la etiqueta para cada imagen cuando hago clic en ellas. Pero cuando lo arrastro, parpadea ... ¿Alguna idea?

Respuesta

34

En respuesta a mi propia pregunta, decidí crear una clase para manejar las imágenes que coloco en la vista.

Código, si alguien está interesado ....

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 

y llamarlo

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

el código anterior proviene de http://www.iphoneexamples.com/ –

+0

gracias por publicar esto, pero estoy recibiendo el efecto de fluctuación de fase al hacer esto, ¿cómo se puede evitar? – itsaboutcode

+0

gracias hombre! trabajando como un encanto :) – soupdiver

1

Normalmente se obtiene una animación implícita cuando se cambia center. ¿Estás jugando con -contentMode o llamando al -setNeedsDisplay por casualidad?

Puede solicitar explícitamente la animación para evitar el borrado y volver a dibujar de esta manera:

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

tenga en cuenta que NSLog() puede ser muy lento (mucho más de lo que esperas, es mucho más complicado que una simple printf), y eso puede causar problemas en algo llamado tan a menudo como touchesMoved:withEvent:.

Por cierto, te estás escapando tmpImage.

+0

gracias por la respuesta . Probé con lo que sugeriste y todavía sucede. Creo que tiene algo que ver con el código que estoy usando para configurar la imagen. Cuando coloco una imagen en la vista en Interface Builder y la configuro como IBOutlet UIImageView en el archivo .h, eso se mueve perfectamente. ¿Me estoy perdiendo algo al configurar cada una de mis imágenes? (ps) gracias por la sugerencia de tmpImage - ¡se lo perdí! –

+0

Pensé que podría haber sido un problema con la etiqueta ... pero ahora estoy pensando que podría ser un problema con las vistas. Cuando coloco la imagen usando el primer bit de código, va a 0,0. Siempre parece querer retroceder cuando lo arrastro. Eso está causando el parpadeo. La posición actual, luego se mueve hacia atrás ... ¡me está volviendo loco! –