diff --git a/AsyncDisplayKit/ASMapNode.h b/AsyncDisplayKit/ASMapNode.h index 5aa6920c50..ccf55584fb 100644 --- a/AsyncDisplayKit/ASMapNode.h +++ b/AsyncDisplayKit/ASMapNode.h @@ -15,9 +15,9 @@ NS_ASSUME_NONNULL_BEGIN @interface ASMapNode : ASImageNode /** - The current region of ASMapNode. This can be set at any time and ASMapNode will animate the change. This property may be set from a background thread before the node is loaded, and will automatically be applied to define the region of the static snapshot (if .liveMap = NO) or the internal MKMapView (otherwise). + The current options of ASMapNode. This can be set at any time and ASMapNode will animate the change.

This property may be set from a background thread before the node is loaded, and will automatically be applied to define the behavior of the static snapshot (if .liveMap = NO) or the internal MKMapView (otherwise).

Changes to the region and camera options will only be animated when when the liveMap mode is enabled, otherwise these options will be applied statically to the new snapshot.

The options object is used to specify properties even when the liveMap mode is enabled, allowing seamless transitions between the snapshot and liveMap (as well as back to the snapshot). */ -@property (nonatomic, assign) MKCoordinateRegion region; +@property (nonatomic, strong) MKMapSnapshotOptions *options; /** This is the MKMapView that is the live map part of ASMapNode. This will be nil if .liveMap = NO. Note, MKMapView is *not* thread-safe. @@ -41,7 +41,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, weak) id mapDelegate; /** - * @discussion This method set the annotations of the static map view and also to the live map view. Passing an empty array clears the map of any annotations. + * @discussion This method sets the annotations of the static map view and also to the live map view. Passing an empty array clears the map of any annotations. * @param annotations An array of objects that conform to the MKAnnotation protocol */ - (void)setAnnotations:(NSArray> *)annotations; diff --git a/AsyncDisplayKit/ASMapNode.mm b/AsyncDisplayKit/ASMapNode.mm index 963b9d3647..c641a17af0 100644 --- a/AsyncDisplayKit/ASMapNode.mm +++ b/AsyncDisplayKit/ASMapNode.mm @@ -18,7 +18,6 @@ { ASDN::RecursiveMutex _propertyLock; MKMapSnapshotter *_snapshotter; - MKMapSnapshotOptions *_options; NSArray *_annotations; CLLocationCoordinate2D _centerCoordinateOfMap; } @@ -28,7 +27,7 @@ @synthesize needsMapReloadOnBoundsChange = _needsMapReloadOnBoundsChange; @synthesize mapDelegate = _mapDelegate; -@synthesize region = _region; +@synthesize options = _options; @synthesize liveMap = _liveMap; #pragma mark - Lifecycle @@ -43,13 +42,6 @@ _needsMapReloadOnBoundsChange = YES; _liveMap = NO; _centerCoordinateOfMap = kCLLocationCoordinate2DInvalid; - - //Default world-scale view - _region = MKCoordinateRegionForMapRect(MKMapRectWorld); - - _options = [[MKMapSnapshotOptions alloc] init]; - _options.region = _region; - return self; } @@ -119,20 +111,19 @@ _needsMapReloadOnBoundsChange = needsMapReloadOnBoundsChange; } -- (MKCoordinateRegion)region +- (MKMapSnapshotOptions *)options { ASDN::MutexLocker l(_propertyLock); - return _region; + return _options; } -- (void)setRegion:(MKCoordinateRegion)region +- (void)setOptions:(MKMapSnapshotOptions *)options { ASDN::MutexLocker l(_propertyLock); - _region = region; + _options = options; if (self.isLiveMap) { - [_mapView setRegion:_region animated:YES]; + [self applySnapshotOptions]; } else { - _options.region = _region; [self resetSnapshotter]; [self takeSnapshot]; } @@ -183,7 +174,9 @@ - (void)setUpSnapshotter { ASDisplayNodeAssert(!CGSizeEqualToSize(CGSizeZero, self.calculatedSize), @"self.calculatedSize can not be zero. Make sure that you are setting a preferredFrameSize or wrapping ASMapNode in a ASRatioLayoutSpec or similar."); - _options.size = self.calculatedSize; + if (!_options) { + [self createInitialOptions]; + } _snapshotter = [[MKMapSnapshotter alloc] initWithOptions:_options]; } @@ -193,6 +186,23 @@ _snapshotter = [[MKMapSnapshotter alloc] initWithOptions:_options]; } +- (void)createInitialOptions +{ + _options = [[MKMapSnapshotOptions alloc] init]; + //Default world-scale view + _options.region = MKCoordinateRegionForMapRect(MKMapRectWorld); + _options.size = self.calculatedSize; +} + +- (void)applySnapshotOptions +{ + [_mapView setCamera:_options.camera animated:YES]; + [_mapView setRegion:_options.region animated:YES]; + [_mapView setMapType:_options.mapType]; + _mapView.showsBuildings = _options.showsBuildings; + _mapView.showsPointsOfInterest = _options.showsPointsOfInterest; +} + #pragma mark - Actions - (void)addLiveMap { @@ -201,7 +211,10 @@ __weak ASMapNode *weakSelf = self; _mapView = [[MKMapView alloc] initWithFrame:CGRectZero]; _mapView.delegate = weakSelf.mapDelegate; - [_mapView setRegion:_options.region]; + if (!_options) { + [weakSelf createInitialOptions]; + } + [weakSelf applySnapshotOptions]; [_mapView addAnnotations:_annotations]; [weakSelf setNeedsLayout]; [weakSelf.view addSubview:_mapView]; @@ -232,7 +245,7 @@ } #pragma mark - Layout -// Layout isn't usually needed in the box model, but since we are making use of MKMapView which is hidden in an ASDisplayNode this is preferred. +// Layout isn't usually needed in the box model, but since we are making use of MKMapView this is preferred. - (void)layout { [super layout];