iOS GoogleMaps SDK - animateToCameraPosition animation finished handler?

后端 未结 5 1886
离开以前
离开以前 2021-02-19 14:54

Currently I am using the GoogleMaps SDK for iOS for various operations. When calling

[self.googleMapsView animateToCameraPosition:[GMSCameraPosition 
                  


        
相关标签:
5条回答
  • 2021-02-19 15:22

    This might work (I haven't tried it):

    [CATransaction begin];
    [CATransaction setValue:[NSNumber numberWithFloat: 1.0f] forKey:kCATransactionAnimationDuration];
    [self.googleMapsView animateToCameraPosition:[GMSCameraPosition 
                            cameraWithLatitude:LATITUDE
                                     longitude:LONGITUDE
                                          zoom:ZOOM]];
    [CATransaction setCompletionBlock:^{
        // ... whatever you want to do when the animation is complete
    }];
    [CATransaction commit];
    

    Basically, this creates an animation transaction that animates your camera movement (change the value for numberWithFloat: to change the speed) and you set your own completion block stating what you want to do when the animation is over. [CATransaction commit] is what fires the animation off.

    Note: this answer partially based off this answer.

    0 讨论(0)
  • 2021-02-19 15:23

    I came across the issue of google's animation methods lacking completion handlers recently.
    The best solution I've found so far is to attach my own completion handler via CATransation API.

    private func attachCompletionHandlerToGoogleAnimations(@noescape animations: () -> Void, #completion: (() -> Void)!) {
        CATransaction.begin()
        CATransaction.setCompletionBlock(completion)
        animations()
        CATransaction.commit()
    }
    

    Example usage:

    attachCompletionHandlerToGoogleAnimations({
        googleMapView.animateToLocation(coordinate)
    }) {
        println("camera moved to location \(coordinate)")
    }
    
    0 讨论(0)
  • 2021-02-19 15:29

    For the reference of future readers of this post, Google Maps SDK for iOS Version 1.4.0 released in July 2013 has added a new delegate method mapView:idleAtCameraPosition: which will be fired at the end of any camera movement - be it programatic animation like in this question or user triggered movements.

    0 讨论(0)
  • 2021-02-19 15:30

    I don't believe there is, however...

    A method that has worked well for me so far is to set a timer to fire (very) shortly after the location stops updating:

    - (void)mapView:(GMSMapView*)mapView didChangeCameraPosition:(GMSCameraPosition*)position {
      // _panTimer is an instance variable of the delegate.
      [_panTimer invalidate];
      _panTimer = [NSTimer timerWithTimeInterval:0.2
                                          target:self
                                        selector:@selector(_mapHasStoppedMoving)
                                        userInfo:nil
                                         repeats:NO];
      [[NSRunLoop currentRunLoop] addTimer:_panTimer forMode:NSDefaultRunLoopMode];
    }
    
    0 讨论(0)
  • 2021-02-19 15:36

    SWIFT version example:

    let vancouver = CLLocationCoordinate2D(latitude: 49.26, longitude: -123.11)
    let calgary = CLLocationCoordinate2D(latitude: 51.05,longitude: -114.05)
    let bounds = GMSCoordinateBounds(coordinate: vancouver, coordinate: calgary)
    let cameraPosition = GMSCameraUpdate.fit(bounds)
    
    CATransaction.begin()
    CATransaction.setValue(1.0/*duration in seconds*/, forKey: kCATransactionAnimationDuration)
    CATransaction.setCompletionBlock({
        print("animation complete, do whatever you want here")
    })
    mMapView.animate(with: cameraPosition)
    CATransaction.commit()
    
    0 讨论(0)
提交回复
热议问题