2012-08-17 12 views
6

He estado trabajando en un reemplazo de mapas desde hace bastante tiempo. Todo funciona con un UIScrollView respaldado por un CATiledLayer.UIScrollView setZoomScale restablece la rotación aplicada a cero

Para rotar mi mapa, giro la capa. (El uso de CATransform3DMakeRotation) funciona bastante bien hasta ahora =)

Pero si alguna vez llamar setZoomScale método de la CATransform3D que va a ser sometido a mi capa es restablecer la rotación a 0.

Mi pregunta es, ¿hay cualquier forma de configurar el zoomscale de mi scrollView sin perder la rotación aplicada?

El mismo problema existe para los gestos de pellizco.

// Informaciones adicionales

Para girar alrededor de la posición actual, tengo que editar el punto de anclaje. Quizás esto también sea un problema para escalar.

- (void)correctLayerPosition { 
    CGPoint position = rootView.layer.position; 
    CGPoint anchorPoint = rootView.layer.anchorPoint; 
    CGRect bounds  = rootView.bounds; 
    // 0.5, 0.5 is the default anchorPoint; calculate the difference 
    // and multiply by the bounds of the view 
    position.x    = (0.5 * bounds.size.width) + (anchorPoint.x - 0.5) * bounds.size.width; 
    position.y    = (0.5 * bounds.size.height) + (anchorPoint.y - 0.5) * bounds.size.height; 
    rootView.layer.position = position; 
} 

- (void)onFinishedUpdateLocation:(CLLocation *)newLocation { 
    if (stayOnCurrentLocation) { 
     [self scrollToCurrentPosition]; 
    } 
    if (rotationEnabled) { 
     CGPoint anchorPoint  = [currentConfig layerPointForLocation:newLocation]; 
     anchorPoint.x    = anchorPoint.x/rootView.bounds.size.width; 
     anchorPoint.y    = anchorPoint.y/rootView.bounds.size.height; 
     rootView.layer.anchorPoint = anchorPoint; 
     [self correctLayerPosition]; 
    } 
} 

Respuesta

7

Puede implementar scrollViewDidZoom: método delegado y concatenar los dos transformaciones para lograr el efecto deseado:

- (void) scrollViewDidZoom:(UIScrollView *) scrollView 
{ 
    CATransform3D scale = contentView.layer.transform; 
    CATransform3D rotation = CATransform3DMakeRotation(M_PI_4, 0, 0, 1); 

    contentView.layer.transform = CATransform3DConcat(rotation, scale); 
} 

EDITAR

tengo idea más simple! ¿Qué tal si agregamos otra vista a la jerarquía con la transformación de rotación adjunta? Aquí está la jerarquía propuesta:

  • ScrollView
    • ContentView - el devuelto por viewForZoomingInScrollView:
      • RotationView - el que tiene la rotación transformar
        • MapView - el que tiene todas las fichas

No creo que el rendimiento sea una preocupación aquí y vale la pena intentarlo.

+0

Hola Bartosz, antes que nada, ¡gracias por esa publicación! Pero eso no funcionó para mí ... He editado el punto de anclaje para rotar alrededor de la posición actual. Tal vez es ese el problema? Editaré mi publicación y agregaré ese código. –

+0

Entonces conservó la rotación, pero el eje de rotación estaba equivocado, ¿verdad? –

+0

Realmente no puedo decirlo. Solo por lo que veo, gira mucho en torno a un punto extraño. Pero el eje parece estar bien. –

Cuestiones relacionadas