diff --git a/AsyncDisplayKit/ASDisplayNode+Subclasses.h b/AsyncDisplayKit/ASDisplayNode+Subclasses.h index d7dad4cbc8..eb85fdffed 100644 --- a/AsyncDisplayKit/ASDisplayNode+Subclasses.h +++ b/AsyncDisplayKit/ASDisplayNode+Subclasses.h @@ -89,7 +89,7 @@ NS_ASSUME_NONNULL_BEGIN * @discussion Gives a chance for subclasses to perform actions after the subclass and superclass have finished laying * out. */ -- (void)layoutDidFinish; +- (void)layoutDidFinish ASDISPLAYNODE_REQUIRES_SUPER; /** * @abstract Called on a background thread if !isNodeLoaded - called on the main thread if isNodeLoaded. @@ -97,7 +97,7 @@ NS_ASSUME_NONNULL_BEGIN * @discussion When the .calculatedLayout property is set to a new ASLayout (directly from -calculateLayoutThatFits: or * calculated via use of -layoutSpecThatFits:), subclasses may inspect it here. */ -- (void)calculatedLayoutDidChange; +- (void)calculatedLayoutDidChange ASDISPLAYNODE_REQUIRES_SUPER; /** @name Layout calculation */ diff --git a/AsyncDisplayKit/ASMapNode.mm b/AsyncDisplayKit/ASMapNode.mm index c44b0b0c78..68d937bbf5 100644 --- a/AsyncDisplayKit/ASMapNode.mm +++ b/AsyncDisplayKit/ASMapNode.mm @@ -14,11 +14,13 @@ #import #import #import +#import @interface ASMapNode() { ASDN::RecursiveMutex _propertyLock; MKMapSnapshotter *_snapshotter; + BOOL _snapshotNeeded; NSArray *_annotations; CLLocationCoordinate2D _centerCoordinateOfMap; } @@ -159,6 +161,15 @@ - (void)takeSnapshot { + // do not trigger snapshot before layout + ASLayout *layout = self.calculatedLayout; + if (layout == nil || CGSizeEqualToSize(CGSizeZero, layout.size)) { + _snapshotNeeded = YES; + return; + } + + _snapshotNeeded = NO; + if (!_snapshotter) { [self setUpSnapshotter]; } @@ -307,6 +318,15 @@ return size; } +- (void)calculatedLayoutDidChange +{ + [super calculatedLayoutDidChange]; + + if (_snapshotNeeded) { + [self takeSnapshot]; + } +} + // -layout isn't usually needed over -layoutSpecThatFits, but this way we can avoid a needless node wrapper for MKMapView. - (void)layout {