【问题标题】:Selecting annotation causes MKMapView to zoom out选择注释会导致 MKMapView 缩小
【发布时间】:2012-08-10 05:40:27
【问题描述】:

我正在尝试让自定义 MKAnnotationView (PostFlag) 在选择时执行两件事:1) 展开以显示有关注释的详细信息,以及 2) 在地图中居中。 The trouble is that when the annotation is selected, the MKMapView sometimes dramatically zooms out.这会导致我处理重要缩放事件的逻辑运行,它将附近的注释收集到常见的注释视图中,导致注释视图重新加载,这通常会用关闭的注释视图替换用户试图查看的注释。

当我尝试将注释居中时,我尝试通过确保没有错误地设置区域(例如,使用会导致缩小的跨度)来解决此问题。那里的一切似乎都很好 - 当我设置它时,该区域是正确的。委托方法 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];

}

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

【问题讨论】:

    标签: iphone ios mkmapview mkannotationview


    【解决方案1】:

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

    根据苹果文档,setRegion 将对视图中的注释做出假设并相应地改变缩放。 setCenterCoordinate 将不进行此类评估,而只是将地图以您指定为地图中心的坐标居中。

    希望这对某人有帮助,因为它也困扰了我一段时间。

    【讨论】:

      【解决方案2】:

      我不认为 scrollEnabled 意味着你认为它的意思。它会阻止用户滚动,但不会阻止您的代码告诉地图滚动。缩放也是如此。

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

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

      所以忘记干预scrollEnabled。再次查看您的 setRegion 调用。我认为你的跨度是错误的。记录该区域并告诉我们它在执行您想要的操作时设置的内容,以及何时彻底缩小。

      【讨论】:

      • 是的!原来是其他代码错误地设置了区域。谢谢。
      猜你喜欢
      • 2010-11-25
      • 2010-11-18
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多