调整MKAnnotationView图像的大小当地图放大和缩小时?

sha*_*oga 7 mkmapview mkannotationview ios

是)我有的

我在地图上有大约150个MKAnnotationViews.每个MKAnnotationView都有一个替换默认引脚的图像.

现在发生了什么

当地图放大时,MKAnnotationViews变小,而缩小时则相反.

我希望发生什么

好吧,我希望它是另一种方式.由于地图很小,我希望MKAnnotationViews更小,以便用户可以看到所有这些,当他放大时我希望它们会更大.

到目前为止我有什么代码

我知道如何获得变焦,我知道我可以将"pMapView.region.span.latitudeDelta"作为缩放量的参考.我知道我可以更改annotationView.frame.

-(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated{
    NSLog(@"mapView.region.span.latitudeDelta = %f",pMapView.region.span.latitudeDelta);
    for (id <MKAnnotation> annotation in pMapView.annotations) {
        MKAnnotationView *annotationView  = [pMapView viewForAnnotation: annotation];
    }
}
Run Code Online (Sandbox Code Playgroud)

请有人帮帮我吗? 谢谢shani

Fun*_*nal 25

实际上在默认的MKMapView上 - 注释(例如图钉或图像)和标注(例如气泡)保持与放大或缩小相同的尺寸.他们没有规模.但是当地图放大时,随着地图缩小和缩小,我得到了与地图相关的点 - 它们看起来正在增长.

因此,您的问题有两种解决方案,它们的工作方式略有不同:

  1. 实现-(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated你已经完成了-从MKMapViewDelegate协议参考.
  2. 将一个附加UIPinchGestureRecognizer到MKMapView对象,然后执行该操作.

选项#1 - mapView:regionDidChangeAnimated:将被调用滚动或缩放事件 - 基本上任何时候地图区域改变顾名思义.这会导致图标的调整大小稍微平滑,因为地图事件的触发频率较低.

我的首选项是选项#2 - 将一个附加UIPinchGestureRecognizer到MKMapView对象,然后实现该操作.捏手势事件会相当快速地触发,因此您可以顺利调整图标大小.而且他们只为一个公认的捏事件开火 - 所以他们不会在滚动事件期间开火.

调用的操作方法必须符合以下签名之一:

- (void)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;

您必须小心不要覆盖地图默认缩放行为.看到这篇文章:"UIMapView:UIPinchGestureRecognizer未被调用"了解更多信息.简短的回答是你必须实现shouldRecognizeSimultaneouslyWithGestureRecognizer:并返回YES.

这里讲的是一些示例代码:

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.mapView.mapType = MKMapTypeStandard;   // also MKMapTypeSatellite or MKMapTypeHybrid

    // Add a pinch gesture recognizer
    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 it's the user location, just return nil.
        if ([annotation isKindOfClass:[MKUserLocation class]])
            return;

        // handle our custom annotations
        //
        if ([annotation isKindOfClass:[MKPointAnnotation class]])
        {
            // try to retrieve an existing pin view first
            MKAnnotationView *pinView = [aMapView viewForAnnotation:annotation];
            //Format the pin view
            [self formatAnnotationView:pinView forMapView:aMapView];
        }
    }    
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

所以在这一点上 - 你再次有几个选项可以调整注释的大小.以下两个代码示例都依赖于Troy Brant的代码来获取MKMapView的缩放级别.

  1. 使用变换调整注释图像和标注的大小.就个人而言,我认为转换会带来更清晰的调整大小.但在大多数情况下,不需要调整标注大小.
  2. 仅调整注释图像的大小 - 我使用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; // This is a circular scale function where at zoom level 0 scale is 0.1 and at zoom level 20 scale is 1.1

        // Option #1
        pinView.transform = CGAffineTransformMakeScale(scale, scale);

        // Option #2
        UIImage *pinImage = [UIImage imageNamed:@"YOUR_IMAGE_NAME_HERE"];
        pinView.image = [pinImage resizedImage:CGSizeMake(pinImage.size.width * scale, pinImage.size.height * scale) interpolationQuality:kCGInterpolationHigh];
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这样做,请不要忘记将其标记为答案.

  • 这是对的,不再适用于iOS6.有人提出了解决方案吗? (5认同)