MKMap无法在ViewDidLoad / ViewWillAppear中设置区域

时间:2013-01-28 11:33:52

标签: iphone ios objective-c

我正在尝试设置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 )

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

这应该是它的样子。

should look like

但这就是我得到的。

bad image

有谁知道为什么会这样? 谢谢

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

MKCoordinateRegion adjustedRegion = [MapView regionThatFits:viewRegion];

2 个答案:

答案 0 :(得分:1)

这里的问题是调用-[MKMapView regionThatFits:]

当您为地图视图设置区域时,视图通常必须稍微调整您的区域以使其在其边界内正确适合。通常,您指定的区域的宽高比与实际视图的宽高比不匹配,例如。

过早做这个问题(例如,在-[MKMapView regionThatFits:]中)是地图视图根据屏幕上自己的大小计算“适合的区域”。在自动布局的情况下,该大小可能不正确或无意义,直到实际布局发生。因此,当调用viewDidLoad时,地图视图可能还不知道其正确的实际大小。

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

viewDidLoad

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

我希望有所帮助。

答案 1 :(得分:0)

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

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

    [super viewDidAppear:animated];
}

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