选择注释会导致MKMapView缩小

时间:2012-08-13 23:29:33

标签: iphone ios mkmapview mkannotationview

我正在尝试让自定义MKAnnotationView(PostFlag)在选择时执行两项操作:1)展开以显示有关注释的详细信息,以及2)在地图中居中。麻烦的是,当选择注释时,MKMapView有时会大幅缩小。这导致我处理重要缩放事件的逻辑运行,这会将附近的注释收集到常见的注释视图中,从而导致注释视图重新加载,这通常会替换用户尝试使用闭合注释视图查看的注释。

当我尝试将注释居中时,尝试确保我没有错误地设置区域(使用会导致缩小的范围),我尝试解决这个问题。那里的一切似乎都没问题 - 当我设置它时,该区域是正确的。委托方法mapView:didChangeRegion:animated:仍然通过缩小区域进行调用。我不确定那里到底发生了什么。

在将区域更改为中心之前将scrollEnabled和zoomEnabled设置为NO似乎没有任何影响。

如果我对注释视图的扩展进行动画处理并不重要 - 缩放仍然会发生。

这听起来对任何人都很熟悉吗?这是一些代码:

- (void) mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    self.selectedFlag = (PostFlag*)view;  //disables scrolling/zooming on the map

    //move region to show expanded flag
    float size = (m_selectedFlag.expandedHeight / 2.0) + 50; //getting a comfortable position in the display
    float dLat = size * mapView.region.span.latitudeDelta / mapView.frame.size.height;  //get span in degrees from degree to pixel ratio

    //build a new coordinate for our center location
    CLLocationCoordinate2D originalCoord = ((PostAnnotation*)m_selectedFlag.annotation).coordinate;
    CLLocationCoordinate2D offsetCoord = CLLocationCoordinate2DMake(originalCoord.latitude + dLat, originalCoord.longitude);

    //adjust the map view to center on that new coordinate
    [m_mapView setRegion: MKCoordinateRegionMake(offsetCoord, m_mapRegionAtTimeOfLastUpdate.span) animated: YES];
}


- (void) setSelectedFlag:(PostFlag *) val
{
    if(m_selectedFlag)
    {
        m_selectedFlag.expanded = NO;
        [m_selectedFlag release];
    }

    if(val)
        m_selectedFlag = [val retain];
    else
        m_selectedFlag = nil;

    if(m_selectedFlag)
    {
        m_selectedFlag.expanded = YES;

        [m_mapView bringSubviewToFront: m_selectedFlag];
        m_mapView.scrollEnabled = NO;
        m_mapView.zoomEnabled = NO;
    }
    else
    {
        m_mapView.scrollEnabled = YES;
        m_mapView.zoomEnabled = YES;
    }
}

当PostFlag崩溃时,它会告诉此视图控制器并重新启用vc在地图上滚动和缩放。因此,为了清楚起见,在扩展注释视图时,将关闭地图上的缩放和滚动。

- (void) postFlagWasCollapsed: (PostFlag*) flag
{
    [self.expandedFlags removeObject: flag];

    if([self.expandedFlags count] == 0)
    {
        m_mapView.scrollEnabled = YES;
        m_mapView.zoomEnabled = YES;
    }
}

另外,为了澄清,我保留了一系列注释视图的扩展。由于用户可以点击附近的注释视图并在先前展开的注释视图关闭的同时展开它,因此可能存在同时扩展两个注释视图的失效。因此,为了确保在所有注释都关闭之前我不会重新开启滚动/缩放,我使用数组。

- (void) postFlagWasExpanded: (PostFlag*) flag
{
    if(!self.expandedFlags)
        self.expandedFlags = [NSMutableArray array];

    if([self.expandedFlags indexOfObject: flag] == NSNotFound)
        [self.expandedFlags addObject: flag];

}

所以这可能是你想要的更多细节。但是,如果有人知道选择注释视图时为什么地图视图会缩小,请提示。请提前致谢!

2 个答案:

答案 0 :(得分:1)

我认为scrollEnabled并不意味着你的意思。它会阻止用户滚动,但它不会阻止您的代码告诉地图滚动。变焦也一样。

“如果将此属性的值设置为NO,则仍可以通过更改region属性中的值以编程方式更改地图位置。”

参考:http://developer.apple.com/library/ios/DOCUMENTATION/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html#//apple_ref/occ/instp/MKMapView/scrollEnabled

所以忘记插入scrollEnabled。再看看你的setRegion电话。我认为你的跨度出错了。记录该区域并告诉我们当它按照您想要的方式进行操作时以及何时从根本上缩小。

答案 1 :(得分:0)

这可能已经解决了,但是如果其他人有同样的问题,只需将 setRegion 替换为 setCenterCoordinate

根据apple doco,setRegion将对视图中的注释进行假设并相应地改变缩放。 setCenterCoordinate不会进行此类评估,只需将地图置于您指定的坐标中心作为地图的中心。

希望这可以帮助别人,因为它也困扰了我一段时间。