Skip to content

Commit 67387c0

Browse files
Adlai-Hollergarrettmoon
authored andcommitted
Build a Tips system (TextureGroup#19)
1 parent 92c1c1b commit 67387c0

33 files changed

Lines changed: 1048 additions & 37 deletions

AsyncDisplayKit.xcodeproj/project.pbxproj

Lines changed: 72 additions & 0 deletions
Large diffs are not rendered by default.

Source/ASCellNode.mm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,11 @@ - (NSString *)supplementaryElementKind
368368
return self.collectionElement.supplementaryElementKind;
369369
}
370370

371+
- (BOOL)supportsLayerBacking
372+
{
373+
return NO;
374+
}
375+
371376
@end
372377

373378

Source/ASControlNode.mm

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,11 @@ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
273273
return YES;
274274
}
275275

276+
- (BOOL)supportsLayerBacking
277+
{
278+
return super.supportsLayerBacking && !self.userInteractionEnabled;
279+
}
280+
276281
#pragma mark - Action Messages
277282

278283
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(ASControlNodeEvent)controlEventMask
@@ -424,7 +429,7 @@ - (void)sendActionsForControlEvents:(ASControlNodeEvent)controlEvents withEvent:
424429
(ASControlNodeEvent controlEvent)
425430
{
426431
// Use a copy to itereate, the action perform could call remove causing a mutation crash.
427-
NSMutableArray *eventTargetActionArray = [_controlEventDispatchTable[_ASControlNodeEventKeyForControlEvent(controlEvent)] copy];
432+
NSArray *eventTargetActionArray = [_controlEventDispatchTable[_ASControlNodeEventKeyForControlEvent(controlEvent)] copy];
428433

429434
// Iterate on each target action pair
430435
for (ASControlTargetAction *targetAction in eventTargetActionArray) {

Source/ASDisplayNode.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,11 @@ extern NSInteger const ASDefaultDrawingPriority;
592592
*/
593593
- (CGRect)convertRect:(CGRect)rect fromNode:(nullable ASDisplayNode *)node AS_WARN_UNUSED_RESULT;
594594

595+
/**
596+
* Whether or not the node would support having .layerBacked = YES.
597+
*/
598+
@property (nonatomic, readonly) BOOL supportsLayerBacking;
599+
595600
@end
596601

597602
/**

Source/ASDisplayNode.mm

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
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

Source/ASEditableTextNode.mm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ - (void)setLayerBacked:(BOOL)layerBacked
306306
[super setLayerBacked:layerBacked];
307307
}
308308

309+
- (BOOL)supportsLayerBacking
310+
{
311+
return NO;
312+
}
313+
309314
#pragma mark - Configuration
310315
@synthesize delegate = _delegate;
311316

Source/ASMapNode.mm

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,5 +427,11 @@ - (void)layout
427427
}
428428
}
429429
}
430+
431+
- (BOOL)supportsLayerBacking
432+
{
433+
return NO;
434+
}
435+
430436
@end
431437
#endif

Source/ASTextNode.mm

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,28 @@ - (void)didLoad
254254
}
255255
}
256256

257+
- (BOOL)supportsLayerBacking
258+
{
259+
if (!super.supportsLayerBacking) {
260+
return NO;
261+
}
262+
263+
// If the text contains any links, return NO.
264+
NSAttributedString *attributedText = self.attributedText;
265+
NSRange range = NSMakeRange(0, attributedText.length);
266+
for (NSString *linkAttributeName in _linkAttributeNames) {
267+
__block BOOL hasLink = NO;
268+
[attributedText enumerateAttribute:linkAttributeName inRange:range options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id _Nullable value, NSRange range, BOOL * _Nonnull stop) {
269+
hasLink = (value != nil);
270+
*stop = YES;
271+
}];
272+
if (hasLink) {
273+
return NO;
274+
}
275+
}
276+
return YES;
277+
}
278+
257279
#pragma mark - Renderer Management
258280

259281
- (ASTextKitRenderer *)_renderer

Source/ASVideoPlayerNode.mm

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,11 @@ - (void)didEnterPreloadState
251251
}
252252
}
253253

254+
- (BOOL)supportsLayerBacking
255+
{
256+
return NO;
257+
}
258+
254259
#pragma mark - UI
255260

256261
- (void)createControls

Source/AsyncDisplayKit.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
#import <AsyncDisplayKit/UIResponder+AsyncDisplayKit.h>
116116

117117
#import <AsyncDisplayKit/AsyncDisplayKit+Debug.h>
118+
#import <AsyncDisplayKit/AsyncDisplayKit+Tips.h>
118119
#import <AsyncDisplayKit/ASDisplayNode+Deprecated.h>
119120

120121
#import <AsyncDisplayKit/ASCollectionNode+Beta.h>

0 commit comments

Comments
 (0)