0

我在 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];
4

2 回答 2

5

在摆弄了几个小时后,我想出了一个让它工作的方法。想和大家分享一下。。。

我做了两个改变。我用 UIView 的动画替换了 CATransaction。我还删除了与 UIView 的动画冲突的 Camera 的默认动画设置。

下面是代码。

[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:2.5];
self.mapView.camera = nextCamera;
[UIView commitAnimations];
于 2013-10-02T01:40:02.403 回答
3

根据 WWDC 'Puting MapKit in Perspective' 视频,您应该避免使用完成处理程序按顺序为地图相机设置动画的任何方法。相反,您应该在地图视图上设置一个委托并监听 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;
    }];

}
于 2013-10-28T14:05:06.793 回答