UIView Animation restablece vistas al rect original

Estoy intentando animar una UIWebView en la pantalla desde el borde derecho cuando se toca un enlace. Para hacer esto, estoy usando dos UIViews. Uno llamado onScreenWebView y otro llamado offScreenWebView. La idea es que pueda animar la window fuera de pantalla de Web en la pantalla de la derecha, y animar la pantalla en blanco de la pantalla a la izquierda. Luego cambia las vistas (por lo que la vista en la pantalla se convierte en onScreenWebView y viceversa), pero mi animation está teniendo problemas. Debo notar que funciona bien LA PRIMERA VEZ. Después de eso, no funciona bien en absoluto.

Las vistas están alineadas como tal

__________ __________ | | | | | on | | off | | screen | | screen | |________| |________| 

Aquí está el código de animation:

 offScreenWebView.hidden = true; offScreenWebView.frame = self.frame; [offScreenWebView offSetX:self.bounds.size.width + kOffsetPadding]; // move offscreen to the right [self logWebRects:@"begin"]; offScreenWebView.hidden = false; [self bringSubviewToFront:offScreenWebView]; [UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationCurveEaseInOut animations:^{ [self logWebRects:@"during 1"]; offScreenWebView.frame = self.frame; onScreenWebView.frame = CGRectMake(-(self.bounds.size.width + kOffsetPadding), 0, onScreenWebView.bounds.size.width, onScreenWebView.bounds.size.height); [self logWebRects:@"during 2"]; }completion:^(BOOL finished) { [self logWebRects:@"finished b4 swap"]; [self swapWebViews]; [self logWebRects:@"finished -- done"]; }]; 

Aquí está el resultado de mi método logWebRects (solo el origen de cada vista)

 Navigation Type :: Link Clicked Rect of self frame :: {{0, 0}, {320, 460}} 99 -- Point of offscreen origin begin :: {335, 0} 0 -- Point of onscreen origin begin :: {0, 0} 99 -- Point of offscreen origin during 1 :: {335, 0} 0 -- Point of onscreen origin during 1 :: {0, 0} 99 -- Point of offscreen origin during 2 :: {0, 0} 0 -- Point of onscreen origin during 2 :: {-335, 0} Navigation Type :: Other 99 -- Point of offscreen origin finished b4 swap :: {0, 0} 0 -- Point of onscreen origin finished b4 swap :: {-335, 0} 0 -- Point of offscreen origin finished -- done :: {-335, 0} 99 -- Point of onscreen origin finished -- done :: {0, 0} Navigation Type :: Link Clicked Rect of self frame :: {{0, 0}, {320, 460}} 0 -- Point of offscreen origin begin :: {335, 0} 99 -- Point of onscreen origin begin :: {0, 0} 0 -- Point of offscreen origin during 1 :: {335, 0} 99 -- Point of onscreen origin during 1 :: {0, 0} 0 -- Point of offscreen origin during 2 :: {0, 0} 99 -- Point of onscreen origin during 2 :: {-335, 0} Navigation Type :: Other 0 -- Point of offscreen origin finished b4 swap :: {335, 0} 99 -- Point of onscreen origin finished b4 swap :: {0, 0} 99 -- Point of offscreen origin finished -- done :: {0, 0} 0 -- Point of onscreen origin finished -- done :: {335, 0} 

Estos loggings son de la ejecución inicial. Luego también la segunda ejecución. Notarás que por cualquier razón, el bloque de animation está restableciendo el marco de cada vista web justo antes del bloque de finalización.

Debo tener en count que cambio las vistas web con un intercambio temporal variable clásico. Además, son vistas hermanas.

Tengo una configuration similar a la tuya en una de mis aplicaciones. Desafortunadamente, no veo nada significativamente malo en su implementación (aunque no podemos ver sus methods de intercambio y logging). El mío no llama a otros methods ni hace tanto trabajo con los frameworks. Tuve un problema con un intercambio temporal variable, así que volví a utilizar el siguiente controller de vista como un parámetro del método, funcionó mucho mejor.

centreOffRight y centreOffLeft son CGPoints que definen el centro de la compensación de la pantalla a la izquierda y a la derecha, respectivamente. next y el previous son los controlleres de vista para cada vista. Este método se llama desde un controller de vista de contenedor.

 -(void)moveNext:(PlayerViewController*)sender { // Need to push this one from the right next.view.center = centreOffRight; [self.view bringSubviewToFront:next.view]; [UIView animateWithDuration:0.3 animations:^{ next.view.center = centreOfScreen; current.view.center = centreOffLeft;} completion:^(BOOL finished){ [current wasMovedOffScreen]; current = next; next = sender; currentDouble = nextIndex;}]; } 

Me resisto a publicar esto como una respuesta ya que no puedo ver por qué esto funcionaría cuando el tuyo no, pero espero que te ayude.

Sé que esto es un poco viejo, pero tuve el mismo problema y este es el único hilo que encontré al respecto.

El problema es que bringSubviewToFront realiza una animation implícita (supongo) que impide que el bloque de animation asigne el fotogtwig correcto.

Lo solucioné deshabilitando la animation implícita. Intente con este recorte de código en lugar del simple bringSubviewToFront.

 [CATransaction begin]; [CATransaction setDisabledActions:YES]; [self bringSubviewToFront:offScreenWebView]; [CATransaction commit];