我使用UIView动画为我的mapView框架设置动画:
[UIView animateWithDuration:0.25f animations:^{
self.mapView.frame = frame;
} completion:nil];
}
在使用上面的内容扩展mapView时,我看到mapView正在添加放错位置的注释,直到动画结束。动画完成后,放错位置的注释会消失。
展开地图时,调用如下:
当我最小化地图时可能没问题,因为mapView:didAddAnnotationViews没有被调用。
我可以在设置动画时以某种方式禁用mapviews regionWillChange吗?
动画之前:
动画中途。看到很多错失的注释。
动画完成。所有错失的注释都消失了。
答案 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];
}