Держите два MKMapView, показывая тот же регион - PullRequest
3 голосов
/ 07 мая 2011

В моем приложении для iPad у меня есть 2 карты одинакового размера, отображаемые рядом друг с другом.Я хочу, чтобы они всегда показывали одну и ту же область.Я достигаю этого сейчас, используя regionDidChangeAnimated: метод делегата.

Это не всегда работает так здорово (иногда области изменяются после масштабирования), и существует задержка между перемещением пользователем одной из карт и другойПеремещение.

Есть ли хороший способ дублировать касания на обеих картах, так что, когда пользователь выполняет панорамирование и масштабирование на одной из них, он автоматически будет делать то же самое на другой карте в то же время?

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

Есть ли способ просто дублировать набор касаний одного UIView на другой (поскольку MKMapView является UIView)?

Спасибо, Росс

Ответы [ 3 ]

0 голосов
/ 27 июля 2011

Если вы не разрабатываете для магазина приложений, вы можете использовать частный API для синтеза касаний.
Смотри http://cocoawithlove.com/2008/10/synthesizing-touch-event-on-iphone.html.

Вы можете перехватывать, дублировать и изменять сенсорные события, переопределяя [UIApplication sendEvent:]. Я не проверял, это должно работать, хотя вы не можете отправить заявку в App Store.

0 голосов
/ 27 июля 2011

Вы можете использовать UIGestureRecognizer, чтобы помочь синхронизировать карты, когда пользователь манипулирует одной из карт.

Например, при использовании UIPanGestureRecognizer обработчик действия распознавателя жестов будет срабатывать несколько раз, пока пользователь выполняет панорамирование карты - в отличие от regionDidChangeAnimated, который срабатывает только после завершения панорамирования.

Вам нужно будет добавить распознаватель жестов на одну или обе карты и реализовать свой собственный метод обработчика жестов. Также реализуйте метод делегата shouldRecognizeSimultaneouslyWithGestureRecognizer и возвращайте YES, чтобы ваш обработчик жестов мог работать вместе с картой.

Пример:

//add the gesture handler to map(s)...
UIPanGestureRecognizer *pgr = [[UIPanGestureRecognizer alloc] 
    initWithTarget:self action:@selector(gestureHandler:)];
pgr.delegate = self;
[mapViewA addGestureRecognizer:pgr];
[pgr release];

//...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:
        (UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

- (void)gestureHandler:(UIGestureRecognizer *)gestureRecognizer
{
    [mapViewB setRegion:mapViewA.region animated:NO];
}

Если вы хотите добавить распознаватель жестов к обоим, вам нужно создать отдельный экземпляр для каждой карты (т. Е. Вы не можете добавить pgr к обеим картам). Вы также можете / нужно добавить UIPinchGestureRecognizer и UITapGestureRecognizer. Вы можете использовать один и тот же метод-обработчик для всех распознавателей.

Я бы все-таки реализовал regionDidChangeAnimated на всякий случай, если жест пропущен.

0 голосов
/ 15 июня 2011

попробуйте подумать об использовании одной статической переменной и одной статической функции для управления уровнем увеличения

...