tapgesture recognizer ios uiview uigesturerecognizer

ios - tapgesture - uipangesturerecognizer swift 4



UIGestureRecognizer para arrastrar UIView (1)

Estoy intentando construir un GestureRecognizer para arrastrar una UIView de derecha a izquierda. Si el usuario arrastra la vista a la mitad de la pantalla, la vista se arrastrará automáticamente a la esquina izquierda para descartarla, pero si el usuario no arrastra hasta la mitad de la pantalla, volverá a la esquina derecha de la pantalla. Poco perdido aquí, algún tutorial o algo así? Gracias

EDITAR: Aquí hay un código, es un UIImageView , dentro de UIScrollView , necesito arrastrar todo el desplazamiento o solo la imagen dentro de él:

_myScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, self.window.bounds.size.height)]; [_myScroll setContentSize:CGSizeMake(self.window.bounds.size.width , 1300)]; _tutorial = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 1300)]; [_tutorial setImage:[UIImage imageNamed:@"Default"]]; _tutorial.contentMode = UIViewContentModeScaleAspectFit; [_myScroll addSubview:_tutorial]; _tutorial.userInteractionEnabled = YES; UIPanGestureRecognizer * recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:_tutorial action:@selector(handlePan:)]; [_tutorial addGestureRecognizer:recognizer]; [self.window addSubview:_myScroll];

Y el método que trato de arrastrar el UIImageView

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { CGPoint translation = [recognizer translationInView:_myScroll]; recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll]; }


Echa un vistazo por aquí . Este es un tutorial de UIGestureRecognizer que le brindará los conceptos básicos para manejar los gestos de pellizco y panorámica. Una vez que haya aprendido los conceptos básicos, es realmente fácil lograr lo que quiere. Todo lo que necesita es verificar la posición de la vista una vez que se completa la panorámica para enviarla a la posición correcta. Eche un vistazo a este otro tutorial en UIScrollViews , puede ayudarle a encontrar el camino a través de la segunda parte.

Ambos tutoriales provienen de raywenderlich.com , probablemente el sitio de tutoriales de iOS más útil que conozco.

Aquí hay un código en su método handlePan: puede trabajar en:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { CGPoint translation = [recognizer translationInView:_myScroll]; recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); if (recognizer.state == UIGestureRecognizerStateEnded) { // Check here for the position of the view when the user stops touching the screen // Set "CGFloat finalX" and "CGFloat finalY", depending on the last position of the touch // Use this to animate the position of your view to where you want [UIView animateWithDuration: aDuration delay: 0 options: UIViewAnimationOptionCurveEaseOut animations:^{ CGPoint finalPoint = CGPointMake(finalX, finalY); recognizer.view.center = finalPoint; } completion:nil]; } [recognizer setTranslation:CGPointMake(0, 0) inView:_myScroll]; }

No le daré la respuesta perfecta aquí, tendrá que trabajar en el código para encontrar la manera de hacerlo funcionar como lo desea.

Aquí hay un último consejo. Puede hacer algún tipo de animación "suave" usando un slideFactor. Ayudará a que tu animación sea más "realista". Trabaja en este código, que agregas justo al comienzo del "si":

CGPoint velocity = [recognizer velocityInView:self.view]; CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y)); CGFloat slideMult = magnitude / 200; float slideFactor = 0.1 * slideMult; // Increase for more slide

Luego, en UIView animateWithDuration: usa slideFactor como la duración.