我正在尝试设置一个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 answer来确保我的一些代码只被使用一次。另外,没有设置区域的原因是它不喜欢这行代码。
MKCoordinateRegion adjustedRegion = [MapView regionThatFits:viewRegion];
2条答案
按热度按时间rsl1atfo1#
这里的问题在于调用
-[MKMapView regionThatFits:]
。当您为Map视图设置区域时,视图通常需要稍微调整您的区域以使其正确地适合其边界。例如,通常您指定的区域的纵横比与实际视图的纵横比不匹配。
如果您**真的 * 需要在设置之前知道调整区域,可以使用
-[MKMapView regionThatFits:]
。过早这样做的问题是(例如,在viewDidLoad
中)是Map视图根据其自身在屏幕上的大小计算“适合的区域”。在自动布局的情况下,该大小可能不正确或没有意义,所以当viewDidLoad被调用时,Map视图可能还不知道它的正确实际大小。从代码中看,除了直接将adjustedRegion传递回map视图之外,似乎并没有长时间保留adjustedRegion,因此可以省略它,而只执行以下操作:
[mapView setRegion:viewRegion animated:NO];
然后,Map视图将根据需要调整该区域。稍后,如果您需要了解调整后的区域,您可以稍后向Map视图询问(在viewDidAppear中:或者在布局发生之后的某个其它时间)。
unguejic2#
我不知道为什么这段代码在
viewDidLoad
方法中不起作用,但为了避免每次视图出现时都触发代码,可以包含一个静态变量(如果不想使用静态变量,可以包含一个属性或特性),如下所示:这将保证你的代码只运行一次。