初始化视图(mapkit示例)

时间:2013-03-05 13:09:33

标签: ios uiview mapkit

我有一个小问题,说明我对Obj C缺乏了解。

我制作了一个小应用程序,其中包含一个根菜单和一个连接到另一个视图(地图)的按钮。我的问题是在加载时在地图中设置默认位置。在我的MapViewController.m里面的代码里,我包含了函数:

    - (void)viewWillAppear:(BOOL)animated {
    CLLocationCoordinate2D zoomLocation;
    zoomLocation.longitude= desired_longitude;
    zoomLocation.latitude = desired_latitude;

    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 4*METERS_PER_MILE, 4*METERS_PER_MILE);

    [self.mapOutlet setRegion:viewRegion animated:YES];}

现在,当我第一次运行应用程序并按下根菜单中的地图按钮时,地图位于大西洋的某个地方。但是如果我导航回根菜单并再次按下地图按钮,地图就会居中在所需的位置!我尝试将此代码放在viewDidLoad方法中,但结果相同。

有人可以解释我如何解决这个问题,更重要的是,这是如何解决的?出现新视图时会调用哪种方法?例如,我觉得只有通过在实现文件中包含上述方法才会感到奇怪,这个方法是在没有我调用的情况下执行的(此时仅在第二次导航到地图视图之后但仍然)...

1 个答案:

答案 0 :(得分:0)

-(void)viewWillAppear:(BOOL)animated是来自UIViewController的继承方法。每次您的视图即将出现时都会调用它。这就是为什么代码在没有调用它的情况下执行的原因,它在iOS中被视为视图和相关控制器实现的一部分。

这是我用来将MKMapView设置为viewWillAppear内的默认位置的代码:

#define kMapDeltaLat 0.586746
#define kMapDeltaLon 0.878906

@interface MapViewController ()
//other properties here
@property bool firstDisplay;
@end

...
- (void)viewWillAppear:(BOOL)animated
{
    if (self.firstDisplay) {
        //zoom in and set the region where we want
        MKCoordinateRegion region;
        MKCoordinateSpan span;
        region.center = self.map.region.center;
        span.latitudeDelta = kMapDeltaLat;
        span.longitudeDelta = kMapDeltaLon;
        region.span = span;
        [self.map setRegion:region animated:NO];
        CLLocationCoordinate2D myLoc = CLLocationCoordinate2DMake(50.245, -1.787);
        [self.map setCenterCoordinate:myLoc animated:YES];
        self.firstDisplay = NO;
    }
}

地图的区域定义了它的视图的样子(即它是如何放大的)。中心坐标定义了地图当前所在的位置。