我在iOS编码。
我有一个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];
答案 0 :(得分:5)
在摆弄了几个小时之后,我找到了一种方法让它发挥作用。想与大家分享......
我做了两处修改。我用UIView的动画取代了CATransaction。我还删除了Camera的默认动画设置,这与UIView的动画相冲突。
以下是代码。
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:2.5];
self.mapView.camera = nextCamera;
[UIView commitAnimations];
答案 1 :(得分:2)
根据WWDC“放置MapKit in Perspective”视频,您应该避免使用完成处理程序按顺序为地图相机设置动画。相反,您应该在地图视图上设置一个委托并监听regionDidChangeAnimated:call以触发序列中的下一个摄像头。这样,可以通过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;
}];
}