Merge pull request #1036 from aaronschubert0/ASMapNode

[ASMapNode] now supports MKMapSnapshotOptions to specify map parameters
This commit is contained in:
appleguy
2016-01-23 12:37:51 -08:00
2 changed files with 34 additions and 21 deletions

View File

@@ -15,9 +15,9 @@ NS_ASSUME_NONNULL_BEGIN
@interface ASMapNode : ASImageNode @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.<br><br>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).<br><br> 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. <br><br> 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. 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 <MKMapViewDelegate> mapDelegate; @property (nonatomic, weak) id <MKMapViewDelegate> 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 * @param annotations An array of objects that conform to the MKAnnotation protocol
*/ */
- (void)setAnnotations:(NSArray<id<MKAnnotation>> *)annotations; - (void)setAnnotations:(NSArray<id<MKAnnotation>> *)annotations;

View File

@@ -18,7 +18,6 @@
{ {
ASDN::RecursiveMutex _propertyLock; ASDN::RecursiveMutex _propertyLock;
MKMapSnapshotter *_snapshotter; MKMapSnapshotter *_snapshotter;
MKMapSnapshotOptions *_options;
NSArray *_annotations; NSArray *_annotations;
CLLocationCoordinate2D _centerCoordinateOfMap; CLLocationCoordinate2D _centerCoordinateOfMap;
} }
@@ -28,7 +27,7 @@
@synthesize needsMapReloadOnBoundsChange = _needsMapReloadOnBoundsChange; @synthesize needsMapReloadOnBoundsChange = _needsMapReloadOnBoundsChange;
@synthesize mapDelegate = _mapDelegate; @synthesize mapDelegate = _mapDelegate;
@synthesize region = _region; @synthesize options = _options;
@synthesize liveMap = _liveMap; @synthesize liveMap = _liveMap;
#pragma mark - Lifecycle #pragma mark - Lifecycle
@@ -43,13 +42,6 @@
_needsMapReloadOnBoundsChange = YES; _needsMapReloadOnBoundsChange = YES;
_liveMap = NO; _liveMap = NO;
_centerCoordinateOfMap = kCLLocationCoordinate2DInvalid; _centerCoordinateOfMap = kCLLocationCoordinate2DInvalid;
//Default world-scale view
_region = MKCoordinateRegionForMapRect(MKMapRectWorld);
_options = [[MKMapSnapshotOptions alloc] init];
_options.region = _region;
return self; return self;
} }
@@ -119,20 +111,19 @@
_needsMapReloadOnBoundsChange = needsMapReloadOnBoundsChange; _needsMapReloadOnBoundsChange = needsMapReloadOnBoundsChange;
} }
- (MKCoordinateRegion)region - (MKMapSnapshotOptions *)options
{ {
ASDN::MutexLocker l(_propertyLock); ASDN::MutexLocker l(_propertyLock);
return _region; return _options;
} }
- (void)setRegion:(MKCoordinateRegion)region - (void)setOptions:(MKMapSnapshotOptions *)options
{ {
ASDN::MutexLocker l(_propertyLock); ASDN::MutexLocker l(_propertyLock);
_region = region; _options = options;
if (self.isLiveMap) { if (self.isLiveMap) {
[_mapView setRegion:_region animated:YES]; [self applySnapshotOptions];
} else { } else {
_options.region = _region;
[self resetSnapshotter]; [self resetSnapshotter];
[self takeSnapshot]; [self takeSnapshot];
} }
@@ -183,7 +174,9 @@
- (void)setUpSnapshotter - (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."); 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]; _snapshotter = [[MKMapSnapshotter alloc] initWithOptions:_options];
} }
@@ -193,6 +186,23 @@
_snapshotter = [[MKMapSnapshotter alloc] initWithOptions:_options]; _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 #pragma mark - Actions
- (void)addLiveMap - (void)addLiveMap
{ {
@@ -201,7 +211,10 @@
__weak ASMapNode *weakSelf = self; __weak ASMapNode *weakSelf = self;
_mapView = [[MKMapView alloc] initWithFrame:CGRectZero]; _mapView = [[MKMapView alloc] initWithFrame:CGRectZero];
_mapView.delegate = weakSelf.mapDelegate; _mapView.delegate = weakSelf.mapDelegate;
[_mapView setRegion:_options.region]; if (!_options) {
[weakSelf createInitialOptions];
}
[weakSelf applySnapshotOptions];
[_mapView addAnnotations:_annotations]; [_mapView addAnnotations:_annotations];
[weakSelf setNeedsLayout]; [weakSelf setNeedsLayout];
[weakSelf.view addSubview:_mapView]; [weakSelf.view addSubview:_mapView];
@@ -232,7 +245,7 @@
} }
#pragma mark - Layout #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 - (void)layout
{ {
[super layout]; [super layout];