2013-10-01 31 views
0

我在iOS中編碼。如何減慢MKMapCamera運動?

我有一個NSArray,它包含幾個MKMapCameras。我想一個接一個地從數組中顯示MKMapCameras。

我把while循環和使用[self.mapView setCamera:nextCamera animated:YES];

然而,這只是顯示了第一個和最後意見。兩者之間的一切都過快了。

我想減慢每個攝像頭的移動速度。有沒有辦法使用CATransaction或使用任何其他動畫技巧來實現它。如果是這樣,請給我看一個示例代碼?

想要更新...我嘗試了下面的代碼。但它不起作用...像我之前提到的那樣,相機運動速度很快。

[CATransaction begin]; 
[CATransaction setAnimationDuration:5.5]; 
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 
[CATransaction setCompletionBlock:^{ 
    [self.mapView setCamera:nextCamera animated:YES]; 
}]; 
[CATransaction commit]; 

回答

5

擺弄了幾個小時後,我想出了一個辦法讓它工作。想和大家分享一樣...

我做了兩個改動。我用UIView的動畫替換了CATransaction。我也刪除相機的默認動畫設置,這與UIView的動畫衝突。

以下是代碼。

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
[UIView setAnimationDuration:2.5]; 
self.mapView.camera = nextCamera; 
[UIView commitAnimations]; 
2

按照WWDC視頻「透視把MapKit」你應該使用完成處理的順序動畫地圖攝像機避免任何辦法。相反,你應該設定一個代表你的地圖視圖,並聽取了regionDidChangeAnimated:調用觸發下一個攝像頭在你的序列。這樣,攝像機移動的速度可以用animateWithDuration進行控制:

-(void)flyToLocation:(CLLocationCoordinate2D)toLocation { 


    CLLocationCoordinate2D startCoord = self.mapView.camera.centerCoordinate; 

    CLLocationCoordinate2D eye = CLLocationCoordinate2DMake(toLocation.latitude, toLocation.longitude); 


    MKMapCamera *upCam = [MKMapCamera cameraLookingAtCenterCoordinate:startCoord 
                 fromEyeCoordinate:startCoord 
                   eyeAltitude:80000]; 


    MKMapCamera *turnCam = [MKMapCamera cameraLookingAtCenterCoordinate:toLocation 
                 fromEyeCoordinate:startCoord 
                   eyeAltitude:80000]; 

    MKMapCamera *inCam = [MKMapCamera cameraLookingAtCenterCoordinate:toLocation 
                 fromEyeCoordinate:eye 
                   eyeAltitude:26000]; 

    self.camerasArray = [NSMutableArray arrayWithObjects:upCam, turnCam, inCam, nil]; 

    [self gotoNextCamera]; 

} 

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { 
    [self gotoNextCamera]; 
} 

-(void)gotoNextCamera { 

    if (self.camerasArray.count == 0) { 
     return; 
    } 

    MKMapCamera *nextCam = [self.camerasArray firstObject]; 
    [self.camerasArray removeObjectAtIndex:0]; 

    [UIView animateWithDuration:3.0 animations:^{ 
     self.mapView.camera = nextCam; 
    }]; 

}