Tengo una vista que tiene dos etiquetas. Cuando deslizo hacia la izquierda llené el siguiente contenido para etiquetar el texto. Del mismo modo, al deslizar hacia la derecha se carga el contenido anterior. Quiero dar un efecto a las etiquetas como si se desplazaran desde la izquierda o la derecha. Utilicé una vista de desplazamiento anterior pero tenía un problema de memoria. Así que estoy usando una vista y el gesto deslizar carga el contenido anterior o siguiente. Quiero agregar el efecto deslizante de scrollview a las etiquetas. ¿Cómo puedo hacer eso?Efecto de desplazamiento con gesto de deslizar en iOS
Respuesta
No estoy seguro exactamente de qué efecto está buscando, pero podría hacer algo como esto, que crea una nueva etiqueta temporal, la saca de la pantalla, anima a moverla sobre la etiqueta que tiene en pantalla, y cuando termine, restablece el anterior y elimina la etiqueta temporal. Esto es lo que una implementación no autolayout podría ser:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
UISwipeGestureRecognizer *left = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(leftSwipe:)];
[left setDirection:UISwipeGestureRecognizerDirectionLeft];
[self.view addGestureRecognizer:left];
// if non-ARC, release it
// [release left];
self.label1.text = @"Mo";
}
- (void)leftSwipe:(UISwipeGestureRecognizer *)gesture
{
NSString *newText;
UILabel *existingLabel = self.label1;
// in my example, I'm just going to toggle the value between Mo and Curly
if ([existingLabel.text isEqualToString:@"Curly"])
newText = @"Mo";
else
newText = @"Curly";
// create new label
UILabel *tempLabel = [[UILabel alloc] initWithFrame:existingLabel.frame];
[existingLabel.superview addSubview:tempLabel];
tempLabel.text = newText;
// move the new label off-frame to the right
tempLabel.transform = CGAffineTransformMakeTranslation(tempLabel.superview.bounds.size.width, 0);
// animate the sliding of them into place
[UIView animateWithDuration:0.5
animations:^{
tempLabel.transform = CGAffineTransformIdentity;
existingLabel.transform = CGAffineTransformMakeTranslation(-existingLabel.superview.bounds.size.width, 0);
}
completion:^(BOOL finished) {
existingLabel.text = newText;
existingLabel.transform = CGAffineTransformIdentity;
[tempLabel removeFromSuperview];
}];
// if non-ARC, release it
// [release tempLabel];
}
Esta animación anima la etiqueta con respecto a su supervista. Es posible que desee asegurarse de que superview
esté configurado para "subvistas de clips". De esta forma, la animación se limitará a los límites de ese superview
, lo que produce un aspecto ligeramente más pulido.
Nota, si utiliza el diseño automático, la idea es la misma (aunque la ejecución es más complicada). Básicamente configure sus restricciones para que la nueva vista se desplace hacia la derecha, luego, en la actualización del bloque de animación/reemplace las restricciones para que la etiqueta original esté a la izquierda y la nueva en el lugar de la etiqueta original, y, finalmente, en el bloque de finalización restablece las restricciones de la etiqueta original y elimina la etiqueta temporal.
Por cierto, todo esto es infinitamente más fácil si se siente cómodo con uno de los incorporados en las transiciones:
- (void)leftSwipe:(UISwipeGestureRecognizer *)gesture
{
NSString *newText;
UILabel *existingLabel = self.label1;
// in my example, I'm just going to toggle the value between Mo and Curly
if ([existingLabel.text isEqualToString:@"Curly"])
newText = @"Mo";
else
newText = @"Curly";
[UIView transitionWithView:existingLabel // or try `existingLabel.superview`
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromRight
animations:^{
existingLabel.text = newText;
}
completion:nil];
}
Muchas gracias por su respuesta detallada. La animación está bien ahora. Pero la animación de scrollview es mejor. El problema con la vista de desplazamiento: vista de desplazamiento interior hay otra vista. Cada vez que el usuario se desplaza, se agrega una nueva vista dentro de la vista de desplazamiento. Pero después de 50 visitas, la aplicación se bloquea con una advertencia de memoria. Intenté algo pero no encontré una solución. Así que decidí eliminar la vista de desplazamiento. – Oktay
@Oktay, parece que tiene un error/fuga simple en su código scrollview. Muchas personas usan scrollviews sin ningún problema. Nuevamente, si publica su código, sospecho que se remedia fácilmente. – Rob
@Oktay Dices que te gusta más la animación de la vista de desplazamiento, pero no estoy seguro de qué es lo que más te gusta de ella. ¿Porque utiliza un gesto panorámico (es decir, es un gesto continuo que comienza a moverse tan pronto como empiezas a mover el dedo por la pantalla)? Hice un gesto de deslizar en lugar de un gesto de panorámica porque tu título sugería que lo querías, pero un gesto de panorámica continua es muy fácil. ¿O hay algo más acerca de la vista de desplazamiento que prefieras? – Rob
Si prefiere animación que se comporta más como una vista de desplazamiento (es decir, información continua sobre la del gesto), que podría ser algo como lo siguiente:
- (void)viewDidLoad
{
[super viewDidLoad];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panHandler:)];
[self.view addGestureRecognizer:pan];
self.label1.text = @"Mo";
}
- (void)panHandler:(UIPanGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateBegan)
{
_panLabel = [[UILabel alloc] init];
// in my example, I'm just going to toggle the value between Mo and Curly
// you'll presumably set the label contents based upon the direction of the
// pan (if positive, swiping to the right, grab the "previous" label, if negative
// pan, grab the "next" label)
if ([self.label1.text isEqualToString:@"Curly"])
_newText = @"Mo";
else
_newText = @"Curly";
// set the text
_panLabel.text = _newText;
// set the frame to just be off screen
_panLabel.frame = CGRectMake(self.label1.frame.origin.x + self.containerView.frame.size.width,
self.label1.frame.origin.y,
self.label1.frame.size.width,
self.label1.frame.size.height);
[self.containerView addSubview:_panLabel];
_originalCenter = self.label1.center; // save where the original label originally was
}
else if (sender.state == UIGestureRecognizerStateChanged)
{
CGPoint translate = [sender translationInView:self.containerView];
if (translate.x > 0)
{
_panLabel.center = CGPointMake(_originalCenter.x - self.containerView.frame.size.width + translate.x, _originalCenter.y);
self.label1.center = CGPointMake(_originalCenter.x + translate.x, _originalCenter.y);
}
else
{
_panLabel.center = CGPointMake(_originalCenter.x + self.containerView.frame.size.width + translate.x, _originalCenter.y);
self.label1.center = CGPointMake(_originalCenter.x + translate.x, _originalCenter.y);
}
}
else if (sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateFailed || sender.state == UIGestureRecognizerStateCancelled)
{
CGPoint translate = [sender translationInView:self.containerView];
CGPoint finalNewFieldLocation;
CGPoint finalOriginalFieldLocation;
BOOL panSucceeded;
if (sender.state == UIGestureRecognizerStateFailed ||
sender.state == UIGestureRecognizerStateCancelled)
{
panSucceeded = NO;
}
else
{
// by factoring in the velocity, we can capture a flick more accurately
//
// (by the way, I don't like iOS's velocity, because if you stop moving, it records the velocity
// prior to stopping the move rather than noting that you actually stopped, so I usually calculate my own,
// but I'll leave this as is for purposes of this example)
CGPoint velocity = [sender velocityInView:self.containerView];
if (translate.x < 0)
panSucceeded = ((translate.x + velocity.x * 0.5) < -(self.containerView.frame.size.width/2));
else
panSucceeded = ((translate.x + velocity.x * 0.5) > (self.containerView.frame.size.width/2));
}
if (panSucceeded)
{
// if we succeeded, finish moving the stuff
finalNewFieldLocation = _originalCenter;
if (translate.x < 0)
finalOriginalFieldLocation = CGPointMake(_originalCenter.x - self.containerView.frame.size.width, _originalCenter.y);
else
finalOriginalFieldLocation = CGPointMake(_originalCenter.x + self.containerView.frame.size.width, _originalCenter.y);
}
else
{
// if we didn't, then just return everything to where it was
finalOriginalFieldLocation = _originalCenter;
if (translate.x < 0)
finalNewFieldLocation = CGPointMake(_originalCenter.x + self.containerView.frame.size.width, _originalCenter.y);
else
finalNewFieldLocation = CGPointMake(_originalCenter.x - self.containerView.frame.size.width, _originalCenter.y);
}
// animate the moving of stuff to their final locations, and on completion, clean everything up
[UIView animateWithDuration:0.3
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
_panLabel.center = finalNewFieldLocation;
self.label1.center = finalOriginalFieldLocation;
}
completion:^(BOOL finished) {
if (panSucceeded)
self.label1.text = _newText;
self.label1.center = _originalCenter;
[_panLabel removeFromSuperview];
_panLabel = nil; // in non-ARC, release instead
}
];
}
}
Nota, he puesto tanto en la etiqueta original, así como la nueva etiqueta en la posición es totalmente, en un recipiente de UIVie w (llamado contenedorView, sorprendentemente), para que pueda recortar la animación a ese contenedor.
- 1. iOS: UIScrollView detección de deslizar Gesto
- 2. Desplazamiento horizontal - Móvil - ¿deslizar?
- 3. cómo manejar 1 a 3 dedos deslizar gesto en IOS
- 4. ¿Hay alguna condición de prioridad entre los métodos de gesto (gesto de desplazamiento y gesto de deslizar)?
- 5. Cómo reconocer el gesto de deslizar en UIScrollView
- 6. deshabilitar gesto deslizar en xcode 4
- 7. cómo detectar deslizar la dirección del gesto?
- 8. Desplazamiento horizontal UIScrollView con gesto de desplazamiento vertical
- 9. Detectar gesto del usuario, como deslizar
- 10. Deshabilitar iOS 5 Centro de notificaciones Gesto en la aplicación
- 11. cocos2d-IOS - Gesto reconocedores
- 12. Acercar y deslizar con OpenGL ES
- 13. Fundido de efecto de desplazamiento
- 14. ¿Cuál es la diferencia entre Pan y Deslizar en iOS?
- 15. IOS 6 UIGestures (Deslizar) deja de funcionar con QLPreviewController
- 16. Sin efecto de desplazamiento con ScrollView en PopupWindow
- 17. jQuery efecto de desplazamiento de imagen
- 18. Pan gesto interfiere con UISlider
- 19. Crear efecto de texto brillante en iOS
- 20. iOS 5.1 golpe gesto secuestrado por UISplitViewController - cómo evitar?
- 21. ¿Cómo se detecta el gesto de deslizar en el iPhone SDK?
- 22. Cómo detectar un gesto de deslizar para borrar en una UITableviewCell personalizada?
- 23. Deteniendo que se reconozca el gesto de deslizar de Google Now
- 24. Desplazamiento de desplazamiento con GestureDetector onScroll
- 25. iOS: ¿Cómo abrir una cámara con efecto de animación?
- 26. Deshabilitar Deslizar a Nueva pestaña Gesto en Google Chrome Mobile para Android
- 27. iOS: ¿Cómo obtener la duración del gesto de presión prolongada?
- 28. Efecto de "desplazamiento sin fin" en una tabla HTML
- 29. ¿Cómo hacer efecto viñeta en iOS?
- 30. WPF imagen deslizar para cambiar la imagen como en iOS
Por cierto, aunque muestro una forma de animar las etiquetas a continuación, no entiendo por qué tendría un "problema de memoria" con una vista de desplazamiento. Si publica ese código, podemos ayudarlo a encontrar su problema de memoria allí, si lo desea. – Rob
use el flujo de la cubierta es el mejor y da buena apariencia – parag