我正在尝试设置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];
答案 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];
}
这将保证您的代码只运行一次。