使用地图缩放缩放MKAnnotationView

时间:2013-12-29 04:54:01

标签: ios mkmapview

我希望在地图放大和缩小时缩放MKAnnotationView,这样如果我的视图占用100米,它将继续在视觉上占据那么多。

这是我到目前为止所拥有的:

- (void)detectPinch:(UIPinchGestureRecognizer*)pinch{
    NSArray* annotations = self.mapView.annotations;
    for(id<MKAnnotation>annotation in annotations){
        if(![annotation isKindOfClass:[MKUserLocation class]] && [annotation isMemberOfClass:[CustomAnnotation class]]){
            CustomAnnotationView* annotationView = (CustomAnnotationView*)[self.mapView viewForAnnotation:annotation];
            CGAffineTransform transform;
            MKZoomScale currentZoomScale = self.mapView.bounds.size.width / self.mapView.visibleMapRect.size.width;
            self.previousMapScale = (self.previousMapScale == 0 ? currentZoomScale : self.previousMapScale);
            if(self.previousMapScale == currentZoomScale) return;
            else transform = CGAffineTransformMakeScale(pinch.scale*((currentZoomScale-self.previousMapScale)+1), pinch.scale*((currentZoomScale-self.previousMapScale)+1));
            annotationView.transform = transform;
            self.previousMapScale = (pinch.state == UIGestureRecognizerStateEnded ? 0 : currentZoomScale);
        }
    }
}

除了第一个之后的每次捏合之外,这几乎都有效,注释视图不会保持它的先前状态并且奇怪地缩放。在第一次调用捏手势识别器处理程序之后,它会针对手势的其余部分正确缩放。这只是捏的初始部分。

有人知道我的数学出错了吗?

2 个答案:

答案 0 :(得分:2)

我弄清楚我做错了什么,它不在数学中,这是因为我在做transform = CGAffineTransformMakeScale(scale, scale);而不是使用CGAffineTransformScale传递现有的转换。我不能理解数学,我发现它在SO帖子上,如果我找到帖子,我会在底部添加学分。

以下代码是使用地图视图缩放注释的完整代码。

- (void)detectPinch:(UIPinchGestureRecognizer*)pinch{
    NSArray* annotations = self.mapView.annotations;
    for(id<MKAnnotation>annotation in annotations){
        if(![annotation isKindOfClass:[MKUserLocation class]] && [annotation isMemberOfClass:[CustomAnnotation class]]){
            CustomAnnotationView* annotationView = (CustomAnnotationView*)[self.mapView viewForAnnotation:annotation];
            CGAffineTransform transform;
            CGFloat currentScale = self.view.width/self.view.bounds.size.width;
            CGFloat newScale = pinch.scale*currentScale;
            transform = CGAffineTransformScale(annotationView.transform, newScale, newScale);
           annotationView.transform = transform;
           pinch.scale = 1;
        }
    }
}

编辑:

我想出了一种更好的缩放注释视图的方法。 而不是在捏手势上使用缩放属性,有时会导致视图缩放错误,如果捏是尖锐和快速,只需这样做:

CLLocationDistance currentMapWidth = [self.mapView mapWidthInMeters];
CGFloat scale = self.previousMapWidth/currentMapWidth;
//apply the transformation with that scale
self.previousMapWidth = currentMapWidth;

mapWidthInMeters是MKMapView上的一个类别。

- (CLLocationDistance)mapWidthInMeters{
    CLLocationDegrees deltaLongitude = self.region.span.longitudeDelta;
    CGFloat latitudeCircumference = 40075160 * cos(self.region.center.latitude * M_PI / 180);
    return deltaLongitude * latitudeCircumference/360;
}

答案 1 :(得分:0)

这就是MKOverlays的用途。它们是自然缩放的