代码之家  ›  专栏  ›  技术社区  ›  Jonathan

相对于缩放级别缩放MKMapView注释

  •  14
  • Jonathan  · 技术社区  · 14 年前

    问题 我试图在一个注释周围创建一个可视半径圆,实际上它保持在一个固定的大小。所以如果我把半径设为100米,当你缩小地图视图时,半径圆会逐渐变小。

    我相信在即将到来的iPhoneOS 4上实现这一点要容易得多,但是我的应用程序需要支持3.0。

    这是一个 video 行为。

    注释以通常的方式添加到Mapview中,我在UIViewController子类上使用了delegate方法( )以查看区域何时更改。

    -(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated{
    
    //Get the map view
    MKCoordinateRegion region;
    CGRect rect;
    
    //Scale the annotations
    for( id<MKAnnotation> annotation in [[self mapView] annotations] ){
    
        if( [annotation isKindOfClass: [Location class]] && [annotation conformsToProtocol:@protocol(MKAnnotation)] ){
            //Approximately 200 m radius
            region.span.latitudeDelta = 0.002f;
            region.span.longitudeDelta = 0.002f;
    
            region.center = [annotation coordinate];
    
            rect = [[self mapView] convertRegion:region toRectToView: self.mapView];
    
            if( [[[self mapView] viewForAnnotation: annotation] respondsToSelector:@selector(setRadiusFrame:)] ){
    
                [[[self mapView] viewForAnnotation: annotation] setRadiusFrame:rect];
    
            }
    
        }
    
    }
    

    位置注释 )是MKAnnotationView的一个子类,它的setRadiusFrame如下所示

    -(void) setRadiusFrame:(CGRect) rect{
    
    CGPoint centerPoint;
    
    //Invert
    centerPoint.x = (rect.size.width/2) * -1;
    centerPoint.y = 0 + 55 + ((rect.size.height/2) * -1);
    
    rect.origin = centerPoint;
    
    [self.radiusView setFrame:rect];
    }
    

    radiusView对象的( )drawRect方法如下所示

    -(void) drawRect:(CGRect)rect{
    
    //NSLog(@"[CircleView drawRect]");
    
    [self setBackgroundColor:[UIColor clearColor]];
    //Declarations
    CGContextRef context;
    CGMutablePathRef path;
    
    //Assignments
    context = UIGraphicsGetCurrentContext();
    
    path = CGPathCreateMutable();
    
    //Alter the rect so the circle isn't cliped
    
    //Calculate the biggest size circle
    if( rect.size.height > rect.size.width ){
        rect.size.height = rect.size.width;
    }
    else if( rect.size.height < rect.size.width ){
        rect.size.width = rect.size.height;
    }
    
    rect.size.height -= 4;
    rect.size.width  -= 4;
    rect.origin.x += 2;
    rect.origin.y += 2;
    
    //Create paths
    CGPathAddEllipseInRect(path, NULL, rect );
    
    //Create colors
    [[self areaColor] setFill];
    
    CGContextAddPath( context, path);
    CGContextFillPath( context );
    
    [[self borderColor] setStroke];
    
    CGContextSetLineWidth( context, 2.0f );
    CGContextSetLineCap(context, kCGLineCapSquare);
    CGContextAddPath(context, path );
    CGContextStrokePath( context );
    CGPathRelease( path );
    
    //CGContextRestoreGState( context );
    
    }
    

    乔纳森

    1 回复  |  直到 14 年前
        1
  •  5
  •   mohsenr    14 年前

    首先,是什么 foo radiusView 的父视图是注释视图,对吗?

    半径视图 应该和annotationView的一致。这样可以解决您的问题:

    -(void) setRadiusFrame:(CGRect)rect{
        rect.origin.x -= 0.5*(self.frame.size.width - rect.size.width);
        rect.origin.y -= 0.5*(self.frame.size.height - rect.size.height);
        [self.radiusView setFrame:rect]
    }
    

    不必要的方法

    你可以直接在 半径视图 并避免上述计算:

        UIView * radiusView = [[[self mapView] viewForAnnotation: annotation] radiusView];
        rect = [[self mapView] convertRegion:foo toRectToView: radiusView.superView];
        [radiusView setFrame:rect];
    
    1. 绘制椭圆时,不要使用 rect 传递给 drawRect: ,它不必与框架相同。直接使用比较安全 self.frame

    如果你需要使用上面的层次结构,我给出了以上几点,但是我不明白为什么不直接在 LocationAnnotationView ? 它毕竟是为了这个目的。您可以这样做:

    1. 缩放时,直接更改注释视图的矩形:

      rect = [[self mapView] convertRegion:foo toRectToView: self.mapView];
      [[[self mapView] viewForAnnotation: annotation] setFrame:rect];
      
    2. 移动

    这更容易实现,当注释视图的中心点随管脚一起移动时,应该可以解决您的问题,而您不应该看到这个问题。

    修正

    1. region.span.longitudeDelta = 0.002*cos(region.center.latitude*pi/180.0);
      

      因为经度增量转换成米随纬度变化。或者,您只能设置纬度增量,然后修改矩形使其变为矩形( width==height

    2. 在里面 图纸: 矩形 ;而是使用 . 这些保证是一样的 矩形 可能有任何价值。