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

bogh5gae  于 2023-01-06  发布在  iOS
关注(0)|答案(2)|浏览(107)

我正在尝试设置一个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];
rsl1atfo

rsl1atfo1#

这里的问题在于调用-[MKMapView regionThatFits:]
当您为Map视图设置区域时,视图通常需要稍微调整您的区域以使其正确地适合其边界。例如,通常您指定的区域的纵横比与实际视图的纵横比不匹配。

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

从代码中看,除了直接将adjustedRegion传递回map视图之外,似乎并没有长时间保留adjustedRegion,因此可以省略它,而只执行以下操作:
[mapView setRegion:viewRegion animated:NO];
然后,Map视图将根据需要调整该区域。稍后,如果您需要了解调整后的区域,您可以稍后向Map视图询问(在viewDidAppear中:或者在布局发生之后的某个其它时间)。

unguejic

unguejic2#

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

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

    [super viewDidAppear:animated];
}

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

相关问题