You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.1 KiB
94 lines
3.1 KiB
#if !defined(__has_feature) || !__has_feature(objc_arc) |
|
#error "This file requires ARC support." |
|
#endif |
|
|
|
#import "GoogleMapsDemos/Samples/AnimatedCurrentLocationViewController.h" |
|
|
|
@implementation AnimatedCurrentLocationViewController { |
|
CLLocationManager *_manager; |
|
GMSMapView *_mapView; |
|
GMSMarker *_locationMarker; |
|
|
|
} |
|
|
|
- (void)viewDidLoad { |
|
[super viewDidLoad]; |
|
|
|
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:38.8879 |
|
longitude:-77.0200 |
|
zoom:17]; |
|
_mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; |
|
_mapView.settings.myLocationButton = NO; |
|
_mapView.settings.indoorPicker = NO; |
|
|
|
self.view = _mapView; |
|
|
|
// Setup location services |
|
if (![CLLocationManager locationServicesEnabled]) { |
|
NSLog(@"Please enable location services"); |
|
return; |
|
} |
|
|
|
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) { |
|
NSLog(@"Please authorize location services"); |
|
return; |
|
} |
|
|
|
_manager = [[CLLocationManager alloc] init]; |
|
if ([_manager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { |
|
[_manager requestWhenInUseAuthorization]; |
|
} |
|
_manager.delegate = self; |
|
_manager.desiredAccuracy = kCLLocationAccuracyBest; |
|
_manager.distanceFilter = 5.0f; |
|
[_manager startUpdatingLocation]; |
|
|
|
} |
|
|
|
#pragma mark - CLLocationManagerDelegate |
|
|
|
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { |
|
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) { |
|
NSLog(@"Please authorize location services"); |
|
return; |
|
} |
|
|
|
NSLog(@"CLLocationManager error: %@", error.localizedFailureReason); |
|
return; |
|
} |
|
|
|
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { |
|
CLLocation *location = [locations lastObject]; |
|
|
|
if (_locationMarker == nil) { |
|
_locationMarker = [[GMSMarker alloc] init]; |
|
_locationMarker.position = location.coordinate; |
|
|
|
// Animated walker images derived from an www.angryanimator.com tutorial. |
|
// See: http://www.angryanimator.com/word/2010/11/26/tutorial-2-walk-cycle/ |
|
|
|
NSArray *frames = @[[UIImage imageNamed:@"step1"], |
|
[UIImage imageNamed:@"step2"], |
|
[UIImage imageNamed:@"step3"], |
|
[UIImage imageNamed:@"step4"], |
|
[UIImage imageNamed:@"step5"], |
|
[UIImage imageNamed:@"step6"], |
|
[UIImage imageNamed:@"step7"], |
|
[UIImage imageNamed:@"step8"]]; |
|
|
|
_locationMarker.icon = [UIImage animatedImageWithImages:frames duration:0.8]; |
|
_locationMarker.groundAnchor = CGPointMake(0.5f, 0.97f); // Taking into account walker's shadow |
|
_locationMarker.map = _mapView; |
|
} else { |
|
[CATransaction begin]; |
|
[CATransaction setAnimationDuration:2.0]; |
|
_locationMarker.position = location.coordinate; |
|
[CATransaction commit]; |
|
} |
|
|
|
GMSCameraUpdate *move = [GMSCameraUpdate setTarget:location.coordinate zoom:17]; |
|
[_mapView animateWithCameraUpdate:move]; |
|
} |
|
|
|
|
|
@end
|
|
|