Проблемы с преобразованием пользовательских координат MapKit в экранные координаты - PullRequest
3 голосов
/ 11 декабря 2011

ОК, на самом деле это три разных вопроса в одной теме:

1) Я использую:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [mapView setFrame :CGRectMake(-100,-100,520,520)];
    [mapView setAutoresizesSubviews:true];
    mapView.showsUserLocation = YES;

    locManager = [[CLLocationManager alloc] init];
    locManager.delegate = self;
    [locManager startUpdatingLocation];
    [locManager startUpdatingHeading];

    [bt_toolbar setEnabled:YES];
}


- (IBAction) CreatePicture
{
     CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(mapView.userLocation.coordinate.latitude, mapView.userLocation.coordinate.longitude);

     CGPoint annPoint = [self.mapView convertCoordinate:coord toPointToView:self.mapView];    
     mapPic = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pic.png"]];
     mapPic.frame = CGRectMake(annPoint.x, annPoint.y, 32, 32);
     [self.view addSubview:macPic];
}

чтобы поместить изображение с помощью GCRectMake поверх координат пользователя, но, к сожалению, изображение не помещается в правильное место:

Coordinate conversion gone wrong

И если я переместу карту, изображение всегда будет с одинаковым смещением относительно местоположения пользователя. Что мне не хватает? Разве он не должен быть расположен прямо над пользователем? Я предполагаю, что причиной этого является смещение (-100, -100), которое я дал mapView (у меня внизу есть панель инструментов, отсюда и смещение).

2) Мой симулятор iOS 5 ведет себя сумасшедшим, по какой-то причине помещая мое местоположение в Глендейл, Феникс (не должно быть в Купертино ??) и действуя так, как будто я двигался на восток; все отлично работает в моем iPhone 4, хотя (за исключением неправильного размещения изображения). Есть идеи?

3) Вместо этого я думал об использовании аннотаций, но я слышал, что они статичны (и мне они действительно нужны динамически). Это правда?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 13 декабря 2011

При добавлении подпредставления его происхождение кадра относительно источника его суперпредставления. В этом случае вы получили происхождение из вида карты, а затем добавили изображение в представление контроллера вида. Вам необходимо преобразовать происхождение вашего изображения в систему координат self.view следующим образом:

CGPoint imageOrigin = [self.view convertPoint:annPoint fromView:self.mapView];
mapPic.frame.origin = imageOrigin;
[self.view addSubview:macPic];

Примечание: это непроверенный код, но главное, что вам нужно преобразовать между координатным пространством mapView (что вы и получили из [self.mapView convertCoordinate: координировать toPointToView: self.mapView]) в координату self.view пространство. Этот пример немного надуманный, чтобы быть иллюстративным, поскольку еще более простой подход заключается в использовании координатного пространства self.view в первую очередь:

CGPoint annPoint = [self.mapView convertCoordinate:coord toPointToView:self.view];    
2 голосов
/ 13 декабря 2011

MKMapView предоставляет следующие методы для перевода между пространством просмотра и географическими координатами:

– convertCoordinate:toPointToView:
– convertPoint:toCoordinateFromView:
– convertRegion:toRectToView:
– convertRect:toRegionFromView:

Они хороши для таких задач, как перевод касаний в координаты карты. Для задачи, которую вы описываете, я думаю, что наложение карты будет более уместным, чем попытка рисовать на карте с помощью подпредставления. Наложение - это своего рода аннотация, которая позволяет вам рисовать любой контент, который вам нравится, но позволяет карте позаботиться о том, чтобы определить, когда наложение видимо, и его вообще нужно рисовать.

3) Я думал об использовании аннотаций, но я слышал они статичны (и я действительно нуждаюсь в них динамически). Это правда?

Что вы подразумеваете под "статическим" и "динамическим" здесь? Вы хотите изменить содержимое в режиме наложения? Или вы хотите изменить местоположение самого наложения? Я думаю, что должно быть возможно обновлять представление наложения так часто, как вам нужно. Я не уверен, что вы можете переместить оверлей, просто изменив его свойство boundingMapRect, но я ожидаю, что это сработает. Если этого не произойдет, вы всегда можете просто удалить наложение и добавить его снова.

Попытка создать свою собственную систему наложения карты вместо использования инструментов, предоставляемых MapKit, должна быть последней вещью в вашем списке параметров. Жизнь всегда проще, когда вы можете работать с фреймворком, а не против него, и ваш код с гораздо меньшей вероятностью сломается в будущем.

2 голосов
/ 13 декабря 2011

Я думаю, вам лучше использовать пользовательский MKPinAnnotationView, используя ваше собственное изображение.согласно этому ответу. Добавить изображение за MKPinAnnotationView

...