0

いくつかの注釈を付けてマップ ビューをコーディングしましたが、うまく機能します。ただし、何らかの理由でデバイスの MapView をクリックし、別の場所をクリックして MapView に戻ると、何らかの理由でユーザーの場所にズームインしません (世界全体の地図が表示されるだけです)。誰かが理由を知っていますか?以下の私のコードを参照してください:

MapViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface MapViewController : UIViewController  <MKMapViewDelegate> 

    @property (nonatomic, strong) IBOutlet MKMapView *mapView;
    @property (nonatomic, retain) NSMutableArray *dispensaries;
    @property (nonatomic, retain) NSMutableData *data;

@end

MapViewController.m

#import "MapViewController.h"
#import "MapViewAnnotation.h"
#import "JSONKit.h"

@implementation MapViewController
@synthesize mapView;
@synthesize dispensaries;
@synthesize data;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad {

    NSLog(@"Getting Device Locations");

    NSString *hostStr = @"http://stylerepublicmagazine.com/dispensaries.php";
    NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:hostStr]];
    NSString *serverOutput = [[NSString alloc] initWithData:dataURL encoding: NSASCIIStringEncoding];
    NSLog(@"server output: %@", serverOutput);
    NSMutableArray *array = [[serverOutput objectFromJSONString] mutableCopy];
    dispensaries = [serverOutput objectFromJSONString];
    NSLog(@"%@", [serverOutput objectFromJSONString]);
    for (NSDictionary *dictionary in array) {
        assert([dictionary respondsToSelector:@selector(objectForKey:)]);

        CLLocationCoordinate2D coord = {[[dictionary objectForKey:@"lat"] doubleValue], [[dictionary objectForKey:@"lng"] doubleValue]};

        MapViewAnnotation *ann = [[MapViewAnnotation alloc] init];
        ann.title = [dictionary objectForKey:@"Name"];
        ann.subtitle = [dictionary objectForKey:@"Address1"];
        ann.coordinate = coord;
        [mapView addAnnotation:ann];

        [mapView setMapType:MKMapTypeStandard];
        [mapView setZoomEnabled:YES];
        [mapView setScrollEnabled:YES];

        self.mapView.delegate = self;
    }
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 2000, 2000);
    [self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES];

    MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
    point.coordinate = userLocation.coordinate;
    point.title = @"You Are Here";
    point.subtitle = @"Your current location";

    [self.mapView addAnnotation:point];
}


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    for (MapViewAnnotation *annotation in self.mapView.annotations) {
        CLLocationCoordinate2D coord = [annotation coordinate];
        CLLocation *annotationLocation = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
        annotation.distance = [newLocation distanceFromLocation:annotationLocation];
    }
}

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;

// Do any additional setup after loading the view from its nib.

- (void)viewDidUnload
{

}

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

@end
4

1 に答える 1

0

これは、シミュレーターでアプリを実行したことを示すものです (ユーザーの場所はデバイスのように変わらないため)。これをデバイスで実行してみましたか?(他に何かが起こっていない限り) 多くのdidUpdateUserLocationヒットが発生する可能性が高いため、シミュレーターで発生したのと同じユーザー エクスペリエンスの問題は発生しません。

それが失敗した場合はviewDidLoad、マップのregion. おそらくCore LocationのCLLocationManager.

didUpdateUserLocationを解釈すると、ユーザーの場所が変わるたびに別の注釈が追加されるため、デバイスでこれを実行していないと思われます。これはデバイス上で特に問題となります。GPS がウォームアップするにつれて、正確さが増して (一般的にhorizontalAccuracy.

マップ上に多数の「You Are Here」注釈を実際に表示したくないと思います。MKMapView以前の場所をすべて削除したことを確認することをお勧めします (または、IB で「ユーザーの場所を表示」をオンにするか、showsUserLocationプロパティを設定したときに取得するデフォルトのユーザー注釈に依存するだけです)。

また、 に設定userTrackingModeするMKUserTrackingModeFollowと、地域が自動的に設定されることにも注意してください ((a) ユーザーが許可を与えており、(b) ユーザーが十分なセル/WiFi/GPS 信号を持っていると仮定します)。

于 2013-09-26T23:01:22.737 に答える