diff --git a/AsyncDisplayKit/ASControlNode+Subclasses.h b/AsyncDisplayKit/ASControlNode+Subclasses.h index 107de031e0..003037532f 100644 --- a/AsyncDisplayKit/ASControlNode+Subclasses.h +++ b/AsyncDisplayKit/ASControlNode+Subclasses.h @@ -7,6 +7,7 @@ */ #import "ASControlNode.h" +#import "ASDisplayNode+Subclasses.h" NS_ASSUME_NONNULL_BEGIN diff --git a/AsyncDisplayKit/ASControlNode.h b/AsyncDisplayKit/ASControlNode.h index 9f5c37e343..8b2de8369c 100644 --- a/AsyncDisplayKit/ASControlNode.h +++ b/AsyncDisplayKit/ASControlNode.h @@ -120,6 +120,11 @@ typedef NS_OPTIONS(NSUInteger, ASControlState) { */ - (void)sendActionsForControlEvents:(ASControlNodeEvent)controlEvents withEvent:(nullable UIEvent *)event; +/** + Class method to enable a visualization overlay of the tapable area on the ASControlNode. For app debugging purposes only. + @param enabled Specify YES to make this debug feature enabled when messaging the ASControlNode class. + */ ++ (void)setEnableHitTestDebug:(BOOL)enable; @end NS_ASSUME_NONNULL_END diff --git a/AsyncDisplayKit/ASControlNode.mm b/AsyncDisplayKit/ASControlNode.mm index d4a0598f39..fcfb67ca6e 100644 --- a/AsyncDisplayKit/ASControlNode.mm +++ b/AsyncDisplayKit/ASControlNode.mm @@ -69,8 +69,12 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v @end -#pragma mark - +static BOOL _enableHitTestDebug = NO; + @implementation ASControlNode +{ + ASDisplayNode *_debugHighlightOverlay; +} #pragma mark - Lifecycle - (id)init @@ -85,6 +89,8 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v return self; } + + #pragma mark - ASDisplayNode Overrides - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { @@ -228,6 +234,18 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v if (!_controlEventDispatchTable) { _controlEventDispatchTable = [[NSMutableDictionary alloc] initWithCapacity:kASControlNodeEventDispatchTableInitialCapacity]; // enough to handle common types without re-hashing the dictionary when adding entries. + + // only show tap-able areas for views with 1 or more addTarget:action: pairs + if (_enableHitTestDebug) { + + // add a highlight overlay node with area of ASControlNode + UIEdgeInsets + self.clipsToBounds = NO; + _debugHighlightOverlay = [[ASDisplayNode alloc] init]; + _debugHighlightOverlay.layerBacked = YES; + _debugHighlightOverlay.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.5]; + + [self addSubnode:_debugHighlightOverlay]; + } } // Enumerate the events in the mask, adding the target-action pair for each control event included in controlEventMask @@ -425,4 +443,26 @@ void _ASEnumerateControlEventsIncludedInMaskWithBlock(ASControlNodeEvent mask, v { } +#pragma mark - Debug +// Layout method required when _enableHitTestDebug is enabled. +- (void)layout +{ + [super layout]; + + if (_debugHighlightOverlay) { + UIEdgeInsets insets = [self hitTestSlop]; + CGRect controlNodeRect = self.bounds; + _debugHighlightOverlay.frame = CGRectMake(controlNodeRect.origin.x + insets.left, + controlNodeRect.origin.y + insets.top, + controlNodeRect.size.width - insets.left - insets.right, + controlNodeRect.size.height - insets.top - insets.bottom); + } +} + ++ (void)setEnableHitTestDebug:(BOOL)enable +{ + _enableHitTestDebug = enable; +} + + @end