MapView没有显示位置和Pins?

时间:2014-02-20 20:30:06

标签: ios location mkmapview

我在mapview上工作,但它没有显示我想要的用户位置以及Pins,我不知道代码是否正确,我认为是,所以我需要你的帮助。

下面是用缩放显示位置的代码:

- (void)viewDidLoad
{
    self.MapView.showsUserLocation = YES;
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
    coordinateuser.latitude = self.MapView.userLocation.coordinate.latitude;
    coordinateuser.longitude = self.MapView.userLocation.coordinate.longitude;
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coordinateuser, 1200, 1200);
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self.MapView setRegion:region animated:YES];
    });
    [super viewDidLoad];
}

继续显示MKPinAnnotationView的代码,这是我认为错误的代码:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
static NSString *SFAnnotationIdentifier = @"SFAnnotationIdentifier";
    MKPinAnnotationView *pinView =
    (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:SFAnnotationIdentifier];
    if (!pinView)
    {
        MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:SFAnnotationIdentifier];

        return annotationView;
    }
    else
    {
        pinView.annotation = annotation;
    }
    cmtlocation = CLLocationCoordinate2DMake(19.502519,-99.259779);
    //UIImage *flagImage = [UIImage imageNamed:@"flag.png"];
    //annotationView.image = flagImage;
    [annotation setCoordinate:cmtlocation];
    return pinView;

}

所以我将非常感谢你的帮助!谢谢!

2 个答案:

答案 0 :(得分:0)

我认为您的代码错误,正如您所料:如果

MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:SFAnnotationIdentifier];  

不返回nil,只返回另一个注释视图:

MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:SFAnnotationIdentifier];
return annotationView;  

否则,您尝试设置nil对象的属性:

pinView.annotation = annotation;

然后在返回nil之前执行其他操作:

cmtlocation = CLLocationCoordinate2DMake(19.502519,-99.259779);
//UIImage *flagImage = [UIImage imageNamed:@"flag.png"];
//annotationView.image = flagImage;
[annotation setCoordinate:cmtlocation];
return pinView;

答案 1 :(得分:0)

实际上,与其他答案所说的相反,它是另一种方式:

如果dequeue返回nil,代码正在创建 MKAnnotationView
默认情况下,MKAnnotationView为空,因此注释(包括用户位置)是不可见的。在viewForAnnotation的顶部,检查annotation是否为MKUserLocation类型并返回nil。对于其他注释,如果要使用自定义MKAnnotationView,请创建image。否则,创建(alloc + init)一个MKPinAnnotationView,它会自动提供一个图像。

此外...

您甚至没有为自定义注释调用addAnnotation。您不应该在coordinate方法中设置注释viewForAnnotation。相反,您应该创建一个注释对象(例如,在viewDidLoad中),设置其coordinatetitle,然后调用addAnnotation

此外,在viewDidLoad中,您在showsUserLocation设置为YES后尝试立即访问用户位置坐标 。用户位置将无法立即使用。相反,请将setRegion调用移至didUpdateUserLocation委托方法(或将userTrackingMode设置为MKUserTrackingModeFollow)。