3737#import < AsyncDisplayKit/ASTraitCollection.h>
3838#import < AsyncDisplayKit/ASWeakProxy.h>
3939#import < AsyncDisplayKit/ASResponderChainEnumerator.h>
40+ #import < AsyncDisplayKit/ASTipsController.h>
4041
4142#if ASDisplayNodeLoggingEnabled
4243 #define LOG (...) NSLog (__VA_ARGS__)
@@ -245,11 +246,6 @@ + (void)load
245246 ASScreenScale ();
246247}
247248
248- + (BOOL )layerBackedNodesEnabled
249- {
250- return YES ;
251- }
252-
253249+ (Class )viewClass
254250{
255251 return [_ASDisplayView class ];
@@ -275,6 +271,8 @@ - (void)_initializeInstance
275271 _eventLog = [[ASEventLog alloc ] initWithObject: self ];
276272#endif
277273
274+ _viewClass = [self .class viewClass ];
275+ _layerClass = [self .class layerClass ];
278276 _contentsScaleForDisplay = ASScreenScale ();
279277
280278 _primitiveTraitCollection = ASPrimitiveTraitCollectionMakeDefault ();
@@ -574,9 +572,6 @@ - (UIView *)_locked_viewToLoad
574572 _viewBlock = nil ;
575573 _viewClass = [view class ];
576574 } else {
577- if (!_viewClass) {
578- _viewClass = [self .class viewClass ];
579- }
580575 view = [[_viewClass alloc ] init ];
581576 }
582577
@@ -610,9 +605,6 @@ - (CALayer *)_locked_layerToLoad
610605 _layerBlock = nil ;
611606 _layerClass = [layer class ];
612607 } else {
613- if (!_layerClass) {
614- _layerClass = [self .class layerClass ];
615- }
616608 layer = [[_layerClass alloc ] init ];
617609 }
618610
@@ -805,26 +797,22 @@ - (BOOL)isSynchronous
805797 return _flags.synchronous ;
806798}
807799
808- - (void )setSynchronous : (BOOL )flag
809- {
810- ASDN::MutexLocker l (__instanceLock__);
811- _flags.synchronous = flag;
812- }
813-
814800- (void )setLayerBacked : (BOOL )isLayerBacked
815801{
816- if (![self .class layerBackedNodesEnabled ]) {
817- return ;
818- }
802+ // Only call this if assertions are enabled – it could be expensive.
803+ ASDisplayNodeAssert (!isLayerBacked || self.supportsLayerBacking , @" Node %@ does not support layer backing." , self);
819804
820805 ASDN::MutexLocker l (__instanceLock__);
821- ASDisplayNodeAssert (!_view && !_layer, @" Cannot change isLayerBacked after layer or view has loaded" );
822- ASDisplayNodeAssert (!_viewBlock && !_layerBlock, @" Cannot change isLayerBacked when a layer or view block is provided" );
823- ASDisplayNodeAssert (!_viewClass && !_layerClass, @" Cannot change isLayerBacked when a layer or view class is provided" );
824-
825- if (isLayerBacked != _flags.layerBacked && !_view && !_layer) {
826- _flags.layerBacked = isLayerBacked;
806+ if (_flags.layerBacked == isLayerBacked) {
807+ return ;
827808 }
809+
810+ if ([self _locked_isNodeLoaded ]) {
811+ ASDisplayNodeFailAssert (@" Cannot change layerBacked after view/layer has loaded." );
812+ return ;
813+ }
814+
815+ _flags.layerBacked = isLayerBacked;
828816}
829817
830818- (BOOL )isLayerBacked
@@ -833,6 +821,12 @@ - (BOOL)isLayerBacked
833821 return _flags.layerBacked ;
834822}
835823
824+ - (BOOL )supportsLayerBacking
825+ {
826+ ASDN::MutexLocker l (__instanceLock__);
827+ return !_flags.synchronous && !_flags.viewEverHadAGestureRecognizerAttached && _viewClass == [_ASDisplayView class ] && _layerClass == [_ASDisplayLayer class ];
828+ }
829+
836830- (BOOL )shouldAnimateSizeChanges
837831{
838832 ASDN::MutexLocker l (__instanceLock__);
@@ -857,6 +851,12 @@ - (void)setThreadSafeBounds:(CGRect)newBounds
857851 _threadSafeBounds = newBounds;
858852}
859853
854+ - (void )nodeViewDidAddGestureRecognizer
855+ {
856+ ASDN::MutexLocker l (__instanceLock__);
857+ _flags.viewEverHadAGestureRecognizerAttached = YES ;
858+ }
859+
860860#pragma mark - Layout
861861
862862#if DEBUG
@@ -3656,6 +3656,9 @@ - (void)didEnterVisibleState
36563656 ASDisplayNodeAssertMainThread ();
36573657 ASDisplayNodeAssertLockUnownedByCurrentThread (__instanceLock__);
36583658 [_interfaceStateDelegate didEnterVisibleState ];
3659+ #if AS_ENABLE_TIPS
3660+ [ASTipsController.shared nodeDidAppear: self ];
3661+ #endif
36593662}
36603663
36613664- (void )didExitVisibleState
0 commit comments