quarezz
quarezz

Reputation: 454

Google Maps SDK iOS - prevent map from changing location on zoom

I have a problem that I can't solve for some time.

I have a GMSMapView with imageView in front of it in the center. In result - I can drag map and always have centered pin. But problems come when I zoom the map. On zooming - position of map target changes and my imageView points to another location.

I can detect if zoom changed, but I cant actually force GMSMapView to do ONLY zoom without any location changing.

-(void) mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position
{
    if (mZoomLevel != mapView.camera.zoom)
    {
        mZoomLevel = mapView.camera.zoom;
    }
}

So basically, I want to have always centered pin, even if I perform zoom. I tried GMSMarker - but it has problems with performance when following map center. It doesn't do it instantly, so I decided to use imageView.

Main question: how to lock current location of the map while performing zoom?

Upvotes: 4

Views: 5336

Answers (3)

Alex
Alex

Reputation: 13

Swift 3:

mapView.settings.scrollGestures = false

Upvotes: -1

UNIQL
UNIQL

Reputation: 118

Google fixed this issue with google maps sdk 1.10.0.

The solution is to simply add this line when configuring GMSMapview:

_mapView.settings.allowScrollGesturesDuringRotateOrZoom = NO;

Upvotes: 8

quarezz
quarezz

Reputation: 454

Well, after 10 days of going back to this problem, I finally solved it! The answer was pretty easy!

Few steps here: 1. Add imageView as marker on top of the GMSMapView 2. Add UIPanGestureRecognizer to the GMSMapView (don't forget to set delegate, it is important) 3. Then use this code:

- (void) didPan:(UIPanGestureRecognizer*) gestureRecognizer
{
    if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
    {
        _mapView.settings.scrollGestures = true;
    }
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if (gestureRecognizer.numberOfTouches > 1)
    {
        _mapView.settings.scrollGestures = false;
    }
    else
    {
        _mapView.settings.scrollGestures = true;
    }
    return true;
}

Upvotes: 3

Related Questions