Pregunta

I tiene un UIView con un manojo de subvistas, todos posicionados usando layoutSubviews. Cuando se cambia el tamaño view, el pariente posiciona todo cambio. Me gustaría que estas re-cálculos que suceda durante un cambio de tamaño de animación (usando + llamadas [UIView beginAnimations:]). Esto no parece estar sucediendo. Algunas ideas?

¿Fue útil?

Solución

Supuesto: ¿Quieres tener múltiples pasos de animación (es decir, la posición no cambia linealmente con el tamaño de la trama)

.

Esto no es posible con una sola animaciones UIView "estándar". ¿Por qué? El marco / límites sólo se establece una vez.

Core Animation tiene tres "árboles" de capa:

  • modelo de árbol es donde su aplicación piensa que las cosas son.
  • presentación del árbol es aproximadamente lo que está siendo visualizada en la pantalla.
  • La render árbol es aproximadamente lo que Core Animation es de composición.

UIView es un (algo delgada) envoltura alrededor de la capa del modelo. Durante una animación UIView, Core Animation actualiza la presentación / render árbol - el árbol del modelo representa el punto final de animaciones. El resultado es que su código puede (en su mayor parte) tratan como animaciones instantánea - mover una vista desde A hasta B al instante lo mueve a B; el cambio sólo pasa a ser animada para el usuario.

Hay más complicadas las cosas que puede hacer con CALayer / CAAnimation directamente, pero no han investigado tanto.

Se podía cadena de múltiples animaciones juntos utilizando - [UIView setAnimationDidStopSelector:]. (También podría tratar de usar múltiples animaciones junto con setAnimationDelay :, pero no estoy seguro de lo que sucede con múltiples animaciones en la misma propiedad; es posible que tenga suerte con setAnimationBeginsFromCurrentState:.)

Si desea un control muy de grano fino, CADisplayLink (OS 3.1 +) es un temporizador que se activa después de cada actualización de la pantalla. Una opción de reserva (para 3.0 de apoyo) es utilizar un NSTimer a 30/60 Hz o menos.

Otros consejos

Completar @ anwer de GrizzlyNetch, se puede establecer la opción de animación UIViewAnimationOptionLayoutSubviews, por lo que no es necesario layoutIfNeeded llamada:

-(void)someMethod{
    double duration = ...;
    [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
        self.frame = ...;
    } completion:nil];
}

Sé que esto es una cuestión de edad, pero este código funciona para mí muy bien (adecuado para su ejemplo de cambio de marco).

-(void)layoutSubviews{
     [super layoutSubviews];
     // layout your subviews here, or whatever
}

-(void)someMethod{
    double duration=...;
    [UIView animateWithDuration:duration animations:^{
        self.frame = ...;
        [self layoutIfNeeded];
    }];
}

Por supuesto que se puede llamar a este método de otro objeto. El "truco" es llamar layoutIfNeeded (o directamente layoutSubviews - lo mismo, si cambia el marco de la setNeedsLayout se llama).

tc

A medida. muy bien explicado los "árboles" de capa, Usted acaba de obligar a la capa de presentación para mostrar la etapa final de la capa del modelo con la animación.

La ventaja de este método es en posibilidad de controlar cuando el marco / delimita cambio está animado y cuando es instantánea.

Espero que esto ayude a alguien:.)

entradas para obtener integridad. Gracias a la cooperación técnica. para explicar que lo que yo quiero hacer, exactamente, no es compatible con Core Animation.

tiempo llegué a una solución razonable. Más bien a continuación, Diseño mis subvistas en -layoutSubviews, lo hago en -setBounds :. Entonces, cuando envuelvo un -setBounds: llamada en un UIView + beginAnimations: bloque, también se animan esas llamadas de posicionamiento, y el resultado final es todo correctamente animar a donde debe dios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top