Обнаружение масштабирования GMSMapView

Есть ли способ определить масштаб (щипок и двойное касание) в этом компоненте Google Map Services?

- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture

Вышеупомянутый метод огня независимо от сделанного движения.


person Cyril    schedule 29.03.2014    source источник


Ответы (4)


Есть еще один способ определить, когда было изменено масштабирование (или любое другое свойство в этом отношении) — Key-Value-Observing (он же KVO). Это особенно полезно, когда нам не предоставлен метод делегата. Из документов Apple:

Наблюдение за ключом-значением предоставляет механизм, который позволяет объектам уведомляться об изменениях определенных свойств других объектов.

Везде, где вы настраиваете вид карты, добавьте этот фрагмент:

[self.mapView addObserver:self forKeyPath:@"camera.zoom" options:0 context:nil];

Теперь вам нужно только реализовать метод -observeValueForKeyPath:ofObject:change:context:, чтобы фактически получить обратный вызов. Вот так:

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

if ([keyPath isEqualToString:@"camera.zoom"]) {

    // this static variable will hold the last value between invocations.
    static CGFloat lastZoom = 0;

    GMSMapView *mapView = (GMSMapView *)object;
    CGFloat currentZoom = [[mapView camera] zoom];

    if (!(fabs((lastZoom) - (currentZoom)) < FLT_EPSILON)) {

        //Zoom level has actually changed!
        NSLog(@"Zoom changed to: %.2f", [[mapView camera] zoom]);

    }

    //update last zoom level value.
    lastZoom = currentZoom;

    }
}

Не забудьте удалить наблюдателя в -dealloc или -viewDidDissapear в зависимости от ваших потребностей:

- (void)dealloc {

    [self.mapView removeObserver:self forKeyPath:@"camera.zoom"];

}

Удачного кодирования :-)

person NKorotkov    schedule 26.05.2015

Надеюсь, вы использовали GMSMapViewDelegate в заголовочном файле

используйте следующий код в файле реализации, который является делегатом объекта GMSMapView

-(void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition*)position {
   float zoom = mapView.camera.zoom;
   // handle you zoom related logic
}
person hrishikesh devare    schedule 23.04.2014

Swift 3
У меня сработал следующий код:

func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
    print("Pinched or tapped on the map")
}

При масштабировании пользователем (двойное касание или сведение пальцев) по экрану этот метод вызывается один раз.

person yasir khan    schedule 18.09.2017
comment
Этот метод будет запускаться, когда камера вообще что-либо делает, а не только масштабирует / сжимает... Таким образом, даже жест панорамирования, программный сброс камеры и т. д. вызовет его. - person Byron Coetsee; 11.04.2019

Некоторые старые, но все же... Вы можете обнаружить это таким образом, сначала скажите mapView, чтобы использовать жесты в поле зрения:

    mapView.settings.consumesGesturesInView = true

    for gestureRecognizer in mapView.gestureRecognizers! {
        gestureRecognizer.addTarget(self, action: "handleMapGesture:")
    }

Во-вторых, в вашей функции проверьте две вещи: состояние и количество касаний.

Если состояние .Changed, начинается жест, и с 2 касаний происходит масштабирование.

Жесткий - это двойное касание, вам нужно реализовать какой-то поздний слушатель и связать последние два жеста, способ определить «Нажатие» - это всего лишь .Begin и .End и одно касание, для этого типа нет состояния .Changed жест.

Примечание: это работает на Swift 2, не тестировалось на 3 или 4.

person Juvs    schedule 14.03.2016
comment
Это перебор, просто говорю - person OhadM; 09.05.2018
comment
@OhadM ну, идея в том, чтобы делиться знаниями, верно? Не имеет смысла ваш комментарий, если нет каких-либо технических последствий для того, что я предлагаю использовать, если это так, пожалуйста, поделитесь своими знаниями - person Juvs; 10.05.2018
comment
Ваша сложность - O (n), а другие более простые решения - нет. Не сказать, что не получится... - person OhadM; 12.05.2018
comment
На самом деле, это было оооочень полезно. Когда вы отключаете панорамирование и оставляете масштабирование (устанавливая радиус геозоны), кажется, что убивает кучу функций делегата, которые в противном случае обнаружили бы это. С некоторой условной проверкой это спасло мой день. Между прочим, есть только один распознаватель жестов, поэтому нет необходимости повторять. .first подходит. - person mylogon; 26.06.2020