地图视图始终会移回用户的当前位置

时间:2015-11-24 12:54:57

标签: ios objective-c iphone google-maps scroll

我已整合GoogleMaps SDK以查看地图。我已经显示了ATM周边用户的当前位置列表。但我遇到的问题是,无论何时滚动到其他位置,地图都会加载用户的起始位置。那么我该如何处理现有的代码来解决这个问题呢?

这是我的代码 -

    #import "ViewController.h"
#import <GoogleMaps/GoogleMaps.h>

@interface ViewController ()
{
    NSUserDefaults *latitudess;
    NSUserDefaults *longitudess;
    GMSMapView *mapView_;
    UIView *viewForSlider;
    UILabel *labelToShowCurrentRadiusValue;
    NSMutableData *urldata;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    mapView_ = [[GMSMapView alloc] init];

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:22.595769
                                                            longitude:88.263639
                                                                 zoom:12];


    mapView_ = [GMSMapView mapWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height) camera:camera];
    mapView_.delegate=self;
    mapView_.settings.myLocationButton = YES;
    mapView_.myLocationEnabled = YES;
    [self.view addSubview:mapView_];



    GMSMarker *marker = [[GMSMarker alloc] init];
    marker.position = CLLocationCoordinate2DMake(22.595769, 88.263639);
    marker.title = @"Howrah";
    marker.snippet = @"Kolkata";
    marker.map = mapView_;



    viewForSlider = [[UIView alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height - 62.0 , self.view.frame.size.width, 62.0)];
    viewForSlider.backgroundColor = [UIColor colorWithWhite:0.9 alpha:0.9];
    //viewForSlider.hidden = YES;
    [self.view addSubview:viewForSlider];



    labelToShowCurrentRadiusValue =[[UILabel alloc]initWithFrame:CGRectMake(0, 8.0, viewForSlider.frame.size.width, 20.0)];
    labelToShowCurrentRadiusValue.backgroundColor=[UIColor clearColor];
    [labelToShowCurrentRadiusValue setFont:[UIFont systemFontOfSize:15.0]];
    labelToShowCurrentRadiusValue.textAlignment=NSTextAlignmentCenter;
    labelToShowCurrentRadiusValue.textColor=[UIColor colorWithRed:84.0/255.0 green:84.0/255.0 blue:84.0/255.0 alpha:1.0];
    [viewForSlider addSubview:labelToShowCurrentRadiusValue];


    [self startUserTracking];
   [self displayAtm];



}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

}

-(void)startUserTracking
{
    // Listen to the myLocation property of GMSMapView.
    if (mapView_.observationInfo == nil)
    {
        [mapView_ addObserver:self
                   forKeyPath:@"myLocation"
                      options:NSKeyValueObservingOptionNew
                      context:NULL];


        dispatch_async(dispatch_get_main_queue(), ^{
            mapView_.myLocationEnabled = YES;
        });
    }
}


- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{


    CLLocation *location = [change objectForKey:NSKeyValueChangeNewKey];

    mapView_.camera = [GMSCameraPosition cameraWithTarget:location.coordinate
                                                     zoom:18];

    labelToShowCurrentRadiusValue.text = [NSString stringWithFormat:@"%f , %f", location.coordinate.latitude, location.coordinate.longitude];
    latitudess=[NSUserDefaults standardUserDefaults];
    longitudess=[NSUserDefaults standardUserDefaults];
    [latitudess setFloat:location.coordinate.latitude forKey:@"LATITUDE"];
    [latitudess setFloat:location.coordinate.longitude forKey:@"LONGITUDE"];
    [latitudess synchronize];


}

-(void)displayAtm
{
    latitudess=[NSUserDefaults standardUserDefaults];

    float retrievedlat=[latitudess floatForKey:@"LATITUDE"];
    float retrievedlong=[latitudess floatForKey:@"LONGITUDE"];
    NSLog(@"detail=%f",retrievedlat);



    NSString *urlforrequest=[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=%f,%f&radius=500&types=atm&name=atm&key=*******",retrievedlat,retrievedlong];
    NSURL *finalurl=[NSURL URLWithString:urlforrequest];





    urldata=[[NSMutableData alloc]initWithContentsOfURL:finalurl];
    NSError *error;
    id jsonresults=[NSJSONSerialization JSONObjectWithData:urldata options:kNilOptions error:&error];

    NSArray *datarray= [jsonresults objectForKey:@"results"];
    for (int i=0; i<datarray.count; i++)
    {
        GMSMarker *marker=[[GMSMarker alloc]init];
        NSDictionary *geometryretrieved=[[datarray valueForKey:@"geometry"]objectAtIndex:i];
        NSDictionary *coordinatesretrieved=[geometryretrieved valueForKey:@"location"];
        marker.position=CLLocationCoordinate2DMake([[coordinatesretrieved objectForKey:@"lat"] doubleValue], [[coordinatesretrieved objectForKey:@"lng"]doubleValue]);
        marker.title=[[datarray valueForKey:@"name"]objectAtIndex:i];
        marker.map=mapView_;


    }

1 个答案:

答案 0 :(得分:1)

简单的解决方案是从一次又一次的观察中移除观察者。在目标C中,我们有一个简单的方法,即

[mapView_ removeObserver:self forKeyPath:@"myLocation"];

通过写这个,我们只加载观察者一次,并通过删除所有总观察者来停止进一步观察..