2012-08-17 13 views
6

Od jakiegoś czasu pracuję nad wymianą map. Całość działa z UIScrollView wspieranym przez CATiledLayer.UIScrollView setZoomScale ustawia zastosowaną rotację na Zero

Aby obrócić mapę, obracam samą warstwę. (Korzystanie CATransform3DMakeRotation) działa całkiem dobrze do tej pory =)

Ale jeśli kiedykolwiek zadzwonić setZoomScale metoda CATransform3D, który ma zostać złożony do mojego warstwy resetuje obroty na 0.

Moje pytanie brzmi, czy istnieje w jaki sposób ustawić zoomscale mojego scrollView bez utraty zastosowanego obrotu?

Ten sam problem występuje w przypadku gestów szczypania.

// Dodatkowe Informacje

obracać się wokół aktualnej pozycji, muszę edytować punkt zaczepienia. Może to też jest problem z skalowaniem.

- (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]; 
    } 
} 

Odpowiedz

7

można zaimplementować scrollViewDidZoom: metodę delegata i złączyć dwie transformacje, aby osiągnąć pożądany efekt:

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

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

EDIT

Mam prostszy pomysł! Co powiesz na dodanie kolejnego widoku do hierarchii z dołączoną transformacją obrotu? Oto proponowane hierarchia:

  • Scrollview
    • contentView - jeden zwrócony przez viewForZoomingInScrollView:
      • RotationView - jeden z rotacją przekształcić
        • MapView - jedna z wszystkimi płytkami

Nie sądzę, że wydajność powinna być tutaj niepokojąca i warto spróbować.

+0

Hej Bartosz, przede wszystkim, dziękuję za ten post! Ale to nie zadziałało ... Zmieniłem punkt zakotwiczenia, aby obrócić się wokół aktualnej pozycji. Może to problem? Będę edytować mój post i dodać ten kod. –

+0

Więc zachował rotację, ale oś obrotu była nieprawidłowa, prawda? –

+0

Nie mogę powiedzieć. Właśnie z tego, co widzę, obraca się dookoła dziwnego punktu. Ale oś wydaje się mieć rację. –

Powiązane problemy