如何减慢MKMapCamera运动?

我在iOS中编码。

我有一个NSArray,其中包含几个MKMapCameras。 我想要一个接一个地从数组中显示MKMapCameras。

我把一个while循环,并使用[self.mapView setCamera:nextCamera animated:YES];

但是,这只是显示第一个和最后一个意见。 中间的一切都过得太快了。

我想减慢每台摄像机的移动速度。 有没有办法使用CATransaction或使用任何其他animation技巧来实现它。 如果是这样,请给我一个示例代码?

想要更新…我尝试了下面的代码。 但它不工作…像我前面提到的那样,摄像机的移动速度很快。

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

经过几个小时摆弄之后,我想出了一个办法让它工作。 想和大家分享一样…

我做了两个改变。 我用UIView的animationreplace了CATransaction。 我也删除了相机的默认animation设置,这与UIView的animation冲突。

下面是代码。

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

根据WWDC“放置MapKit透视”video,您应该避免使用完成处理程序按顺序对地图相机进行animation制作的任何方法。 相反,你应该在你的地图视图上设置一个委托,并监听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; }]; }