禁用在为其框架设置动画时向mapView添加注释

时间:2014-06-23 12:55:17

标签: ios objective-c annotations mkmapview

我使用UIView动画为我的mapView框架设置动画:

     [UIView animateWithDuration:0.25f animations:^{
           self.mapView.frame = frame;
        } completion:nil];
}

在使用上面的内容扩展mapView时,我看到mapView正在添加放错位置的注释,直到动画结束。动画完成后,放错位置的注释会消失。

展开地图时,调用如下:

  1. animateWithDuration begin
  2. 的MapView:regionWillChangeAnimated
  3. 的MapView:didAddAnnotationViews
  4. 的MapView:regionDidChangeAnimated
  5. animateWithDuration完成
  6. 当我最小化地图时可能没问题,因为mapView:didAddAnnotationViews没有被调用。

    我可以在设置动画时以某种方式禁用mapviews regionWillChange吗?

    动画之前:

    before

    动画中途。看到很多错失的注释。

    middle

    动画完成。所有错失的注释都消失了。

    after

2 个答案:

答案 0 :(得分:2)

作为临时解决方案,我建议您做以下事项:
1.在更改框架之前,使用mapView的screenShot创建UIImageView 2.将imageView作为subView添加到父视图并隐藏mapView 3.动画两个:imageView和mapView,并改变它的帧 4.在完成动画块中取消隐藏mapView并删除imageView。

这样的事情:

- (UIImage *)imageFromView:(UIView *) view
{
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
        UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, [[UIScreen mainScreen] scale]);
    } else {
        UIGraphicsBeginImageContext(view.frame.size);
    }
    [view.layer renderInContext: UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

- (void)foo
{
    UIImageView *mapScreenShotView = [[UIImageView alloc] initWithImage:[self imageFromView:self.mapView]];
    mapScreenShotView.frame = self.mapView.frame;
    [self.mapView.superview addSubview:mapScreenShotView];
    self.mapView.hidden = YES;

    CGRect frame = self.mapView.frame;
    frame.origin = ...
    frame.size   = ...
    // here no more need to animate mapView, because currently its hidden. So we will change it's frame in outside of animation block.
    self.mapView.frame = frame;
    [UIView animateWithDuration:0.25f animations:^{
       mapScreenShotView.frame = frame;
    } completion:^{ 
       self.mapView.hidden = NO;
       [mapScreenShotView removeFromSuperview];
    }];
}

使用此临时解决方案,直到找到解决该问题的正确方法。

答案 1 :(得分:1)

我尝试了另一个临时解决方案,它看起来效果很好。 它是关于隐藏mapView在动画期间添加的所有注释。

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {

    ...

    if (self.isAnimating) {
        [annotationView hideForDurationOfSeconds:0.25f];
    }

    ...

}

在annotationView中:

- (void)hideForDurationOfSeconds:(NSTimeInterval)duration {
    self.hidden = YES;
    [self performSelector:@selector(setHidden:) withObject:NO afterDelay:duration];
}