Есть ли способ определить масштаб (щипок и двойное касание) в этом компоненте Google Map Services?
- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture
Вышеупомянутый метод огня независимо от сделанного движения.
Есть ли способ определить масштаб (щипок и двойное касание) в этом компоненте Google Map Services?
- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture
Вышеупомянутый метод огня независимо от сделанного движения.
Есть еще один способ определить, когда было изменено масштабирование (или любое другое свойство в этом отношении) — 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"];
}
Удачного кодирования :-)
Надеюсь, вы использовали GMSMapViewDelegate
в заголовочном файле
используйте следующий код в файле реализации, который является делегатом объекта GMSMapView
-(void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition*)position {
float zoom = mapView.camera.zoom;
// handle you zoom related logic
}
Swift 3
У меня сработал следующий код:
func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
print("Pinched or tapped on the map")
}
При масштабировании пользователем (двойное касание или сведение пальцев) по экрану этот метод вызывается один раз.
Некоторые старые, но все же... Вы можете обнаружить это таким образом, сначала скажите mapView, чтобы использовать жесты в поле зрения:
mapView.settings.consumesGesturesInView = true
for gestureRecognizer in mapView.gestureRecognizers! {
gestureRecognizer.addTarget(self, action: "handleMapGesture:")
}
Во-вторых, в вашей функции проверьте две вещи: состояние и количество касаний.
Если состояние .Changed
, начинается жест, и с 2 касаний происходит масштабирование.
Жесткий - это двойное касание, вам нужно реализовать какой-то поздний слушатель и связать последние два жеста, способ определить «Нажатие» - это всего лишь .Begin
и .End
и одно касание, для этого типа нет состояния .Changed
жест.
Примечание: это работает на Swift 2, не тестировалось на 3 или 4.
.first
подходит.
- person mylogon; 26.06.2020