2

我正在尝试为 MKmap 设置坐标和区域。我编写的代码如果我把它放在 viewDidAppear 中就可以工作,但是我不希望它出现在这个方法中,因为我不希望每次出现视图时都设置它。

这是我试图在这些方法中实现的代码

//set the map delegate
MapView.delegate = (id)self;

//set the co-ords
CLLocationCoordinate2D zoomLocation;
zoomLocation.latitude = LAT_POSN;
zoomLocation.longitude= LON_POSN;

//create region
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, startZoom, startZoom);
MKCoordinateRegion adjustedRegion = [MapView regionThatFits:viewRegion];
[MapView setRegion:adjustedRegion animated:YES];

编辑: startZoom 是一个常数,我已经记录它以确保在设置区域之前它在那里

我试过使用

if (self.isMovingToParentViewController )

为了让它在第一次调用视图时运行,但它仍然显示相同的结果。

这就是它应该的样子。

应该看起来像

但这就是我得到的。

坏形象

有谁知道这可能是为什么?谢谢

答案:我使用了 tkanzakic 答案来确保我的某些代码只使用了一次。另外,没有设置区域的原因是它不喜欢这行代码。

MKCoordinateRegion adjustedRegion = [MapView regionThatFits:viewRegion];
4

2 回答 2

1

这里的问题在于调用-[MKMapView regionThatFits:].

当您为地图视图设置区域时,视图通常必须稍微调整您的区域以使其正确适应其范围。例如,您指定的区域的纵横比通常与实际视图的纵横比不匹配。

如果在设置之前确实需要知道调整后的区域,可以使用-[MKMapView regionThatFits:]. 过早这样做的问题(例如,在viewDidLoad)是地图视图根据它自己在屏幕上的大小计算“适合的区域”。在自动布局的情况下,该大小可能不正确或没有意义,直到实际布局发生。因此,当调用 viewDidLoad 时,地图视图可能还不知道其正确的实际大小。

从您的代码来看,您似乎不会长时间持有adjustedRegion,只是将其直接传递回地图视图。所以你可以省略它,而是这样做:

[mapView setRegion:viewRegion animated:NO];

然后地图视图将根据需要调整该区域。稍后如果您需要知道调整后的区域是什么,您可以稍后向地图视图询问(在 viewDidAppear: 或布局发生后的其他时间)。

我希望这会有所帮助。

于 2013-01-28T15:03:20.810 回答
0

我不知道为什么这段代码在该viewDidLoad方法中不起作用,但为了避免每次出现视图时都会触发代码,您可以包含一个静态变量(如果您不想使用,则可以包含一个属性或属性)静态变量),像这样:

- (void)viewDidAppear:(BOOL)animated
{
    static BOOL isFirstLoad = YES;
    if (isFirstLoad) {
        // Put your code here
        isFirstLoad = NO;
    }

    [super viewDidAppear:animated];
}

这将保证您的代码只运行一次。

于 2013-01-28T11:51:54.197 回答