实际上,在默认的MKMapView上,标注(例如,图钉或图像)和弹出窗口(例如,气泡)在缩放时保持相同的大小。它们不会缩放。但是我理解你的意思-相对于地图,它们似乎随着地图缩小而增长,随着地图放大而缩小。
因此,有两种解决方法,它们的工作方式略有不同:
1. 实现MKMapViewDelegate协议引用中的
-(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated
方法-您已经完成了这一步。
2. 将
UIPinchGestureRecognizer
附加到MKMapView对象上,然后实现该操作。
选项#1-
mapView:regionDidChangeAnimated:
将为滚动或缩放事件调用-基本上任何时候地图区域发生更改,如名称所示。这会导致图标稍微不太平滑地调整大小,因为地图事件触发较少。
我更喜欢选项#2-将
UIPinchGestureRecognizer
附加到MKMapView对象上,然后实现该操作。捏合手势事件会相当快地触发,因此您可以平稳地调整图标大小。它们仅在识别出捏合事件时触发-因此它们不会在滚动事件期间触发。
调用的操作方法必须符合以下签名之一:
- (void)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;
你必须小心不要覆盖地图的默认缩放行为。请参阅此文章:"UIMapView:UIPinchGestureRecognizer未被调用",了解更多信息。简短的答案是,你必须实现shouldRecognizeSimultaneouslyWithGestureRecognizer:
并返回YES。
总之,这里有一些示例代码:
- (void)viewDidLoad
{
[super viewDidLoad];
self.mapView.mapType = MKMapTypeStandard;
UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];
pinchRecognizer.delegate = self;
[self.mapView addGestureRecognizer:pinchRecognizer];
[pinchRecognizer release];
}
#pragma mark -
#pragma mark UIPinchGestureRecognizer
- (void)handlePinchGesture:(UIPinchGestureRecognizer *)pinchRecognizer {
if (pinchRecognizer.state != UIGestureRecognizerStateChanged) {
return;
}
MKMapView *aMapView = (MKMapView *)pinchRecognizer.view;
for (id <MKAnnotation>annotation in aMapView.annotations) {
if ([annotation isKindOfClass:[MKUserLocation class]])
return;
if ([annotation isKindOfClass:[MKPointAnnotation class]])
{
MKAnnotationView *pinView = [aMapView viewForAnnotation:annotation];
[self formatAnnotationView:pinView forMapView:aMapView];
}
}
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
在这一点上,您有几个选项来调整注释的大小。以下两个代码示例都依赖于
Troy Brant的代码以获取MKMapView的缩放级别。
- 使用变换同时调整注释图像和标题。个人认为,变换可以产生更清晰的调整效果。但在大多数情况下,不需要调整标题。
- 仅调整注释图像 - 我使用Trevor Harmon的正确方式调整UIImage的大小,但我认为它的调整效果不如第一个方法。
以下是更多示例代码:
- (void)formatAnnotationView:(MKAnnotationView *)pinView forMapView:(MKMapView *)aMapView {
if (pinView)
{
double zoomLevel = [aMapView zoomLevel];
double scale = -1 * sqrt((double)(1 - pow((zoomLevel/20.0), 2.0))) + 1.1;
pinView.transform = CGAffineTransformMakeScale(scale, scale);
UIImage *pinImage = [UIImage imageNamed:@"YOUR_IMAGE_NAME_HERE"];
pinView.image = [pinImage resizedImage:CGSizeMake(pinImage.size.width * scale, pinImage.size.height * scale) interpolationQuality:kCGInterpolationHigh];
}
}
如果这个方法有效,请不要忘记将其标记为答案。