инициализация набора карт с определенной широтой и долготой Iphone

Я делаю приложение для iphone, которое должно брать широту и долготу из массива, а также находить и отображать карту с настраиваемыми аннотациями / метками. Я использовал мапкит вот как:

//MapViewController.h

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

@interface MapViewController : UIViewController  <MKMapViewDelegate> {
 IBOutlet MKMapView *mapView;
 MKPlacemark *mPlacemark;
}

@property (nonatomic, retain) IBOutlet MKMapView *mapView;
@end


//MapViewController.m

#import "MapViewController.h"
#import <MapKit/MapKit.h>

@implementation MapViewController
@synthesize mapView;


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    CLLocationCoordinate2D location = mapView.userLocation.coordinate;
    MKCoordinateRegion region;
    MKCoordinateSpan span;

    location.latitude  = 37.250556;
    location.longitude = -96.358333;

    span.latitudeDelta = 0.05;
    span.longitudeDelta = 0.05;

    region.span = span;
    region.center = location;

    [mapView setRegion:region animated:YES];
    [mapView regionThatFits:region];
}

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


@end

Это не место для широты и долготы. Пожалуйста помоги.


person binbash    schedule 21.07.2010    source источник
comment
Пожалуйста, в следующий раз отформатируйте свой код перед публикацией (выберите его и нажмите кнопку «010101» на панели инструментов. И не включайте части кода, которые явно не нужны - другим будет намного проще вам помочь.   -  person Vladimir    schedule 21.07.2010
comment
обязательно сделаю в следующий раз и далее ...   -  person binbash    schedule 21.07.2010


Ответы (2)


Я сделал образец проекта с вашим кодом, и он отлично работает - карта позиционируется в ожидаемой (кажется) области. Проверьте, инициализирован ли ваш mapView ivar (правильно ли установлены соединения в IB?)

Изменить: в вашем коде вы просто устанавливаете видимую область карты, но не добавляете к ней никаких аннотаций (кроме автоматического отображения текущей позиции пользователя, которая всегда находится в Купертино, если вы тестируете на симуляторе). Чтобы прикрепить к карте булавку, вам нужно создать объект, подтверждающий MKAnnotation протокол, и добавить его в mapView:

// Sample example just to show annotation
// in your program you will likely need to use custom annotation objects 
CLLocation* myLocation = [[CLLocation alloc] initWithLatitude:37.250556 longitude:-96.358333];
[mapView addAnnotation:myLocation];

Некоторые (не очень актуальные) комментарии к вашему коду:

  • Вам не нужно инициализировать переменную местоположения текущим местоположением, так как вы перезаписываете ее значения координат сразу после этого.
  • Почему вы вызываете [mapView setNeedsDisplay]; в viewDidUnload методе? Я не уверен, что это может вызвать серьезные проблемы, но вы должны использовать этот метод для очистки памяти (например, для освобождения оставшихся выходов), а не для перерисовки пользовательского интерфейса.
person Vladimir    schedule 21.07.2010
comment
Что ж, он отображает карту с булавкой на калифорнии, купертино, что является местоположением по умолчанию, но координаты, которые я указал в приведенном выше коде, должны закрепить его на Канзасе. Я удалил инициализацию и setNeedDisplay, но он прикрепляет метку к Купертино, а не Канзас. - person binbash; 21.07.2010
comment
Что интересно, я не уверен, почему ваш фрагмент кода работает. CLLocation на самом деле не соответствует MKAnnotation (но он работает, когда я запускаю этот код). - person Nate; 23.05.2012
comment
@Nate, протокол MKAnnotation имеет только один обязательный метод - 'координата', а у CLLocation есть этот метод, поэтому во время выполнения не будет проблем, хотя, скорее всего, компилятор выдаст предупреждение, когда вы добавите CLLocation в качестве аннотации в mapview. В любом случае это был всего лишь пример, и в реальной жизни вы должны использовать настраиваемые объекты, соответствующие протоколу MKAnnotation. - person Vladimir; 23.05.2012
comment
Ага. Компилятор предупреждает об этом, но, конечно, все мы знаем, что в Objective-C это не значит, что он не будет работать :). Похоже, Apple, вероятно, не заставила CLLocation формально реализовывать MKAnnotation, потому что они не хотели, чтобы CoreLocation зависел от MapKit ... но на самом деле CLLocation действительно соответствует этому протоколу в том виде, в котором он сейчас существует. - person Nate; 23.05.2012

Вы настроили карту на отслеживание местоположения пользователя в другом месте? возможно, это значение по умолчанию отменяет ваше ручное перемещение карты в Канзас.

edit Да, не видел, это был июль прошлого года. Что ж, возможно, вы могли бы поделиться с нами своим решением, если бы проблема не в этом

person Craig    schedule 14.02.2011