1

我很困惑这是如何工作的。我正在创建一个 CLGeocoder 以根据字符串值删除引脚。我有这个:

- (void)placeMarkFromString:(NSString *)address {
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
        [placemarks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSLog(@"%@", [obj description]);
        }];

        // Check for returned placemarks
        if (placemarks && [placemarks count] > 0) {
            CLPlacemark *topResult = [placemarks objectAtIndex:0];

            // Create an MKPlacemark and add it to the mapView
            MKPlacemark *place = [[MKPlacemark alloc] initWithPlacemark:topResult];
            AddressAnnotation *anAddress = [[AddressAnnotation alloc] init];
            anAddress.address = place.subThoroughfare;
            anAddress.street = place.thoroughfare;
            anAddress.city = place.locality;
            anAddress.state = place.administrativeArea;
            anAddress.zip = place.postalCode;
            anAddress.name = place.name;

            //[self.mapView addAnnotation:place];
            [self.mapView addAnnotation:anAddress];
            self.currentPlacemark = place;

            // Center map on that region
            MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(topResult.location.coordinate, 2000, 2000);
            MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:region];
            [_mapView setRegion:adjustedRegion animated:YES];
        }
        else {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No Results Found" message:@"" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
            [alert show];
        }
        if (error) {
            NSLog(@"Error: %@", [error localizedDescription]);
        }
    }];
}

所以最初,我将我的 MKPlacemark 添加到地图上,它显示了红色图钉。但是它没有动画。我基本上希望能够删除 3 种 MKPinAnnotationView 颜色中的任何一种,具有标注和标题/副标题作为地点的名称和地址,类似于谷歌地图的方式。但我没有得到任何动画。

所以我想也许我需要创建自己的符合 MKAnnotation 类的对象。所以我这样做了,但是当我尝试将它添加到该位置时,我在 viewForAnnotation 委托方法中看不到它的 annotationView。该方法在这里:

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id<MKAnnotation>)annotation {
    static NSString *placeMarkIdentifier = @"SimplePinIdentifier";
    if ([annotation isKindOfClass:[AddressAnnotation class]]) {
        MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:placeMarkIdentifier];
        if (annotationView == nil) {
            annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:placeMarkIdentifier];
        }
        else {
            annotationView.annotation = annotation;
        }
        annotationView.enabled = YES;
        annotationView.animatesDrop = YES;
        annotationView.draggable = YES;
        annotationView.pinColor = MKPinAnnotationColorPurple;
        annotationView.canShowCallout = YES;


        // Create a button for the annotation
//        UIButton *rightArrowButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
//        annotationView.rightCalloutAccessoryView = rightArrowButton;
//        [self performSelector:@selector(openCallout:) withObject:annotation afterDelay:0.5];
        return annotationView;
    }
    return nil;

}

所以我想我的问题是,我是否需要创建自己的对象来执行此操作,我是否走在正确的轨道上,我做错了什么,为什么在一种情况下,我要添加一个 MKPlacemark 对象,然后如果我以其他方式做,我添加一个对象,但不一定是 MKPlacemark 的子类。谢谢!

4

1 回答 1

0

AddressAnnotation首先,当您使用自定义注释对象(即。 )时,您可能看不到注释视图的原因是它coordinate没有被设置(因此它出现在 0,0)。

在该placeMarkFromString方法中,代码设置了很多属性,AddressAnnotation但没有设置coordinate,因此注释没有出现在预期的位置。

如果您设置coordinate,它将出现在预期的位置并带有动画。


关于另一个关于为什么在使用时看不到动画的问题MKPlacemark

默认情况下,地图视图将创建一个MKPinAnnotationView带有红色大头针但animatesDrop设置为 的NO

所以在,你必须像你一样viewForAnnotation明确地这样做。MKPlacemarkAddressAnnotation

如果您的所有注释都将使用MKPinAnnotationView,而不是检查您将创建的每个不同的注释类,您可以通过nil在注释类是时在方法顶部返回来翻转条件MKUserLocation,然后运行其余代码而不任何类检查(即在所有其他情况下返回MKPinAnnotationView设置animatesDrop为)。YES

于 2012-05-14T14:09:56.633 回答