【问题标题】:iOS SDK - MapKit MKAnnotationView questions - location and multiple annotations?iOS SDK - MapKit MKAnnotationView 问题 - 位置和多个注释?
【发布时间】:2012-04-08 21:33:02
【问题描述】:

快速进步,尝试学习进出 MapKit 和注释。

我取得了一些不错的进展,但是当我尝试添加位置服务时遇到了问题。

如果我返回 nil

     - (MKAnnotationView *)mapView:(MKMapView *)mapView 
                 viewForAnnotation:(id < MKAnnotation >)annotation

方法,我得到的结果非常接近我正在寻找的结果,我有我的注释图钉,我的用户位置以标准方式显示。

但如果我返回 myPins(所有参数设置如下),我会在 所有引脚 上得到正确的行为,但属性也是 用户的位置设置(它是一个红色的大头针,每次视图移动或选择大头针时它都会落到位)。烦人。

如何将注释的属性与位置分开设置?有没有办法返回多个 MKAnnotationViews?我知道我缺少一些基本概念,但如果你能给我任何帮助,我将不胜感激。提前致谢。

这是我的主视图控制器,总共:

//
//  ViewController.m
//  mapFun
//


#import "ViewController.h"

@implementation ViewController
@synthesize segmentedControl;
@synthesize mapView,location, myLocations, myAnnotation, region;

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidLoad
{
[super viewDidLoad];

self.mapView.delegate = self; 

//location manager stuff

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

if([CLLocationManager locationServicesEnabled])
{
[self.mapView setShowsUserLocation:YES];
[locationManager startUpdatingHeading]; 
}

[self loadUpLocations];

//set first zoom center and span, to zoom from to initial zoom

region.center=CLLocationCoordinate2DMake(
                                         33.75070416856952, 
                                         -84.37034368515015);
MKCoordinateSpan span;
span.latitudeDelta=.3;
span.longitudeDelta=.3;
region.span=span;

[mapView setRegion:region animated:YES];

}

- (void)viewDidUnload
{
[self setMapView:nil];
[self setSegmentedControl:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];

//zoom to initial zoom
 [self setInitialZoom];
}

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

//Load up a buncha locations

-(void)loadUpLocations{

myLocations =  [LoadObjectsFromFile loadFromFile:@"locations2" ofType:@"plist"];

//loop through and make annotations

for (NSString *loc in myLocations) {
    NSDictionary *value =[myLocations objectForKey:loc];

    //create instance of MapAnnotations
    CLLocationCoordinate2D temp = 
    CLLocationCoordinate2DMake(
                               [[value objectForKey:@"latitude"] doubleValue],
                               [[value objectForKey:@"longitude"] doubleValue]);

    myAnnotation = [[MapAnnotations alloc]initWithLocation:temp];
    myAnnotation.title = [value objectForKey:@"title"];
    myAnnotation.subtitle = [value objectForKey:@"subtitle"];
    myAnnotation.info =[value objectForKey:@"info"];

    [self.mapView addAnnotation:myAnnotation];

}
}

- (void)setInitialZoom{

// MKCoordinateRegion region;
region.center = CLLocationCoordinate2DMake(33.77, -84.37);

//set level of zoom
MKCoordinateSpan span;
span.latitudeDelta=.04;
span.longitudeDelta=.04;
region.span=span;
[mapView setRegion:region animated:YES];
}

// used when selecting annotations

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{

MKPointAnnotation *selectedAnnotation = view.annotation;

NSLog(@"The annotation selected is %@.",selectedAnnotation.title);

//set level of zoom
CLLocationCoordinate2D newCenter = 
CLLocationCoordinate2DMake(
                           selectedAnnotation.coordinate.latitude,
                           selectedAnnotation.coordinate.longitude);
MKCoordinateSpan span;
span.latitudeDelta=.02;
span.longitudeDelta=.02;
MKCoordinateRegion zoomRegion = MKCoordinateRegionMake(newCenter, span);

[ self.mapView setRegion:zoomRegion animated:YES];

}

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
// [self zoomOutToInitial:nil];
}

- (IBAction)zoomOutToInitial:(id)sender {

[self.mapView setRegion:region animated:YES];
}

- (IBAction)segChanged:(id)sender {
if (self.segmentedControl.selectedSegmentIndex==0) {
    [self.mapView setMapType:MKMapTypeStandard];
}
if (self.segmentedControl.selectedSegmentIndex==1) {
    [self.mapView setMapType:MKMapTypeSatellite];
}
if (self.segmentedControl.selectedSegmentIndex==2) {
    [self.mapView setMapType:MKMapTypeHybrid];
}
}

// This gets called every time an annotation is in the map view

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation
{
NSLog(@"Map view can see annotation %@.",annotation.title);
MKPinAnnotationView *myPins;
if (!myPins) {
    myPins= [[MKPinAnnotationView alloc]initWithAnnotation:self.myAnnotation 
                                  reuseIdentifier:@"myPins"];
}

myPins.animatesDrop = YES;
myPins.canShowCallout = YES;
myPins.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

return nil;
//return myPins;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
[manager stopUpdatingHeading];
}
@end

回答我自己的问题。还是谢谢。

终于在 Apple 的一个名为“Location Awareness Programming Guide”的有用文档中找到了答案。

这是更正 MKAnnotationView 方法:

// This gets called every time an annotation is in the map view

- (MKAnnotationView *)mapView:(MKMapView *)theView 
            viewForAnnotation:(id < MKAnnotation >)annotation
{
    NSLog(@"Map view can see annotation %@.",annotation.title);

   //if the annotation is a user location
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        return nil;
    }

//uses my custom class

if ([annotation isKindOfClass:[MapAnnotations class]]) {

    // try for reuse of pins

    MKPinAnnotationView *myPins = (MKPinAnnotationView *) 
              [theView dequeueReusableAnnotationViewWithIdentifier:@"myPins"];

    if (!myPins) {

            myPins= [[MKPinAnnotationView alloc]initWithAnnotation:annotation 
                                                   reuseIdentifier:@"myPins"];
            myPins.animatesDrop = YES;
            myPins.canShowCallout = YES;
            myPins.rightCalloutAccessoryView = 
            [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

        }else
            myPins.annotation = annotation;
        return myPins;
    }
    return nil;
}

【问题讨论】:

    标签: ios map mapkit mkannotation mkannotationview


    【解决方案1】:

    基本概念是当且仅当请求的视图实际上是用户位置视图时才返回。 您只需测试转发给您的 Annotation 是否属于 userlocation 类,如下所示:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation
    {
      if ([annotation isKindOfClass:[MKUserLocation class]])
            return nil;
    // do your usual stuff
    }
    

    【讨论】:

    • 是的。这就是我所做的,上面,但谢谢。希望这会让寻找这个答案的其他人更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多