Cómo reconocer el toque en todo el SubView oscilante para realizar una animation interactiva

En el código a continuación, la subvista (nube) oscila en la location dada. Al hacer tapping en esa subvista durante la swing, se mueve fuera de los límites hacia el lado derecho, luego se mueve desde la izquierda. Pero el gesto de pulsación no funciona en toda la subvista, solo funciona en el extremo derecho del subView oscilante. Quiero deslizar hacia afuera y hacia dentro de la nube para que funcione, siempre que se escuche toda la subview de la nube.

A continuación se muestra el código del file .h y .m respectivamente.

Archivo: OscillatingCloudsViewController.h

#import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> @interface OscillatingCloudsViewController : UIViewController { IBOutlet UIView *movingCloud1; UIImage *cldImg; } - (IBAction)animateCloud; - (IBAction)animateCloudBegin; @end 

Archivo: OscillatingCloudsViewController.m

 #import "OscillatingCloudsViewController.h" @implementation OscillatingCloudsViewController - (void) viewWillAppear:(BOOL)animated { UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureAnimateCloud)]; tapGesture.numberOfTapsRequinetworking = 1; tapGesture.numberOfTouchesRequinetworking = 1; tapGesture.cancelsTouchesInView = YES; [movingCloud1 addGestureRecognizer:tapGesture]; movingCloud1.userInteractionEnabled = YES; [super viewWillAppear: animated]; } - (void)viewDidLoad { [super viewDidLoad]; [self animateCloud]; } - (IBAction) animateCloud { cldImg = [UIImage imageNamed:@"cloud1.png"]; movingCloud1=[[UIView alloc]initWithFrame:CGRectMake(50, 50, cldImg.size.width, cldImg.size.height)]; [movingCloud1 setBackgroundColor:[UIColor colorWithPatternImage:cldImg]]; [self.view addSubview:movingCloud1]; movingCloud1.userInteractionEnabled = YES; [self viewWillAppear:YES]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:5]; [UIView setAnimationRepeatCount:HUGE_VALF]; [UIView setAnimationRepeatAutoreverses:YES]; CGPoint pos = movingCloud1.center; pos.x = 220.0f; movingCloud1.center = pos; [UIView commitAnimations]; } - (void) animateCloudHidden { [movingCloud1 setHidden:YES]; } - (IBAction)animateCloudBegin { movingCloud1.frame = CGRectMake(-100, 50, cldImg.size.width, cldImg.size.height); [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:1]; [UIView setAnimationRepeatCount:1]; [UIView setAnimationRepeatAutoreverses:NO]; CGPoint pos = movingCloud1.center; pos.x = cldImg.size.width; movingCloud1.center = pos; [UIView commitAnimations]; } - (IBAction) tapGestureAnimateCloud { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:2]; [UIView setAnimationRepeatCount:1]; [UIView setAnimationRepeatAutoreverses:NO]; movingCloud1.center = CGPointMake(1100.0f, 81.5f); [UIView commitAnimations]; [self performSelector:@selector(animateCloudBegin) withObject:nil afterDelay:2.0f]; [self performSelector:@selector(animateCloudHidden) withObject:nil afterDelay:3.0f]; [self performSelector:@selector(animateCloud) withObject:nil afterDelay:3.0f]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end 

He entendido tu problema. En viewwillApper, estás asegurando el Gesto y dentro del método animateCloud, asignando tu UIV de view de movingCloud1.

Para implementar esto, necesita abandonar los hermosos pasos.

  • En ViewdidLoad debe asignar y agregar la vista movingCloud1 a su vista personal.

  • Después de agregar el gesto a la vista movingCloud1.

  • Tu tapGesture funcionará ahora. Por lo tanto, dentro de su método de tapgesture solo necesita configurar la animation para su vista de movingCloud1