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.
137 lines
4.1 KiB
137 lines
4.1 KiB
#if !defined(__has_feature) || !__has_feature(objc_arc) |
|
#error "This file requires ARC support." |
|
#endif |
|
|
|
#import "GoogleMapsDemos/Samples/MarkerLayerViewController.h" |
|
|
|
#import <GoogleMaps/GoogleMaps.h> |
|
|
|
@interface CoordsList : NSObject |
|
@property(nonatomic, readonly, copy) GMSPath *path; |
|
@property(nonatomic, readonly) NSUInteger target; |
|
|
|
- (id)initWithPath:(GMSPath *)path; |
|
|
|
- (CLLocationCoordinate2D)next; |
|
|
|
@end |
|
|
|
@implementation CoordsList |
|
|
|
- (id)initWithPath:(GMSPath *)path { |
|
if ((self = [super init])) { |
|
_path = [path copy]; |
|
_target = 0; |
|
} |
|
return self; |
|
} |
|
|
|
- (CLLocationCoordinate2D)next { |
|
++_target; |
|
if (_target == [_path count]) { |
|
_target = 0; |
|
} |
|
return [_path coordinateAtIndex:_target]; |
|
} |
|
|
|
@end |
|
|
|
@implementation MarkerLayerViewController { |
|
GMSMapView *_mapView; |
|
GMSMarker *_fadedMarker; |
|
} |
|
|
|
- (void)viewDidLoad { |
|
[super viewDidLoad]; |
|
_mapView = [[GMSMapView alloc] init]; |
|
_mapView.camera = [GMSCameraPosition cameraWithLatitude:50.6042 longitude:3.9599 zoom:5]; |
|
_mapView.delegate = self; |
|
self.view = _mapView; |
|
|
|
GMSMutablePath *coords; |
|
GMSMarker *marker; |
|
|
|
// Create a plane that flies to several airports around western Europe. |
|
coords = [GMSMutablePath path]; |
|
[coords addLatitude:52.310683 longitude:4.765121]; |
|
[coords addLatitude:51.471386 longitude:-0.457148]; |
|
[coords addLatitude:49.01378 longitude:2.5542943]; |
|
[coords addLatitude:50.036194 longitude:8.554519]; |
|
marker = [GMSMarker markerWithPosition:[coords coordinateAtIndex:0]]; |
|
marker.icon = [UIImage imageNamed:@"aeroplane"]; |
|
marker.groundAnchor = CGPointMake(0.5f, 0.5f); |
|
marker.flat = YES; |
|
marker.map = _mapView; |
|
marker.userData = [[CoordsList alloc] initWithPath:coords]; |
|
[self animateToNextCoord:marker]; |
|
|
|
// Create a boat that moves around the Baltic Sea. |
|
coords = [GMSMutablePath path]; |
|
[coords addLatitude:57.598335 longitude:11.290512]; |
|
[coords addLatitude:55.665193 longitude:10.741196]; |
|
[coords addLatitude:55.065787 longitude:11.083488]; |
|
[coords addLatitude:54.699234 longitude:10.863762]; |
|
[coords addLatitude:54.482805 longitude:12.061272]; |
|
[coords addLatitude:55.819802 longitude:16.148186]; // final point |
|
[coords addLatitude:54.927142 longitude:16.455803]; // final point |
|
[coords addLatitude:54.482805 longitude:12.061272]; // and back again |
|
[coords addLatitude:54.699234 longitude:10.863762]; |
|
[coords addLatitude:55.065787 longitude:11.083488]; |
|
[coords addLatitude:55.665193 longitude:10.741196]; |
|
marker = [GMSMarker markerWithPosition:[coords coordinateAtIndex:0]]; |
|
marker.icon = [UIImage imageNamed:@"boat"]; |
|
marker.map = _mapView; |
|
marker.userData = [[CoordsList alloc] initWithPath:coords]; |
|
[self animateToNextCoord:marker]; |
|
} |
|
|
|
- (void)animateToNextCoord:(GMSMarker *)marker { |
|
CoordsList *coords = marker.userData; |
|
CLLocationCoordinate2D coord = [coords next]; |
|
CLLocationCoordinate2D previous = marker.position; |
|
|
|
CLLocationDirection heading = GMSGeometryHeading(previous, coord); |
|
CLLocationDistance distance = GMSGeometryDistance(previous, coord); |
|
|
|
// Use CATransaction to set a custom duration for this animation. By default, changes to the |
|
// position are already animated, but with a very short default duration. When the animation is |
|
// complete, trigger another animation step. |
|
|
|
[CATransaction begin]; |
|
[CATransaction setAnimationDuration:(distance / (50 * 1000))]; // custom duration, 50km/sec |
|
|
|
__weak MarkerLayerViewController *weakSelf = self; |
|
[CATransaction setCompletionBlock:^{ |
|
[weakSelf animateToNextCoord:marker]; |
|
}]; |
|
|
|
marker.position = coord; |
|
|
|
[CATransaction commit]; |
|
|
|
// If this marker is flat, implicitly trigger a change in rotation, which will finish quickly. |
|
if (marker.flat) { |
|
marker.rotation = heading; |
|
} |
|
} |
|
|
|
- (void)fadeMarker:(GMSMarker *)marker { |
|
_fadedMarker.opacity = 1.0f; // reset previous faded marker |
|
|
|
// Fade this new marker. |
|
_fadedMarker = marker; |
|
_fadedMarker.opacity = 0.5f; |
|
} |
|
|
|
#pragma mark - GMSMapViewDelegate |
|
|
|
- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker { |
|
[self fadeMarker:marker]; |
|
return YES; |
|
} |
|
|
|
- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate { |
|
[self fadeMarker:nil]; |
|
} |
|
|
|
@end
|
|
|