diff --git a/ios/RNSVGNode.h b/ios/RNSVGNode.h index 2ba5e3fab..81513b30a 100644 --- a/ios/RNSVGNode.h +++ b/ios/RNSVGNode.h @@ -7,6 +7,7 @@ */ #import +#import #import "RNSVGCGFCRule.h" #import "RNSVGSvgView.h" @class RNSVGGroup; @@ -35,7 +36,13 @@ extern CGFloat const RNSVG_DEFAULT_FONT_SIZE; @property (nonatomic, strong) NSString *markerStart; @property (nonatomic, strong) NSString *markerMid; @property (nonatomic, strong) NSString *markerEnd; + +/** + * Used to control how touch events are processed. + */ +@property (nonatomic, assign) RCTPointerEvents pointerEvents; @property (nonatomic, assign) BOOL responsible; + @property (nonatomic, assign) CGAffineTransform ctm; @property (nonatomic, assign) CGAffineTransform screenCTM; @property (nonatomic, assign) CGAffineTransform matrix; diff --git a/ios/RNSVGNode.m b/ios/RNSVGNode.m index 19ac803f0..938f89ab4 100644 --- a/ios/RNSVGNode.m +++ b/ios/RNSVGNode.m @@ -165,6 +165,15 @@ - (void)reactSetInheritedBackgroundColor:(UIColor *)inheritedBackgroundColor self.backgroundColor = inheritedBackgroundColor; } +- (void)setPointerEvents:(RCTPointerEvents)pointerEvents +{ + _pointerEvents = pointerEvents; + self.userInteractionEnabled = (pointerEvents != RCTPointerEventsNone); + if (pointerEvents == RCTPointerEventsBoxNone) { + self.accessibilityViewIsModal = NO; + } +} + - (void)setName:(NSString *)name { if ([name isEqualToString:_name]) { diff --git a/ios/RNSVGRenderable.m b/ios/RNSVGRenderable.m index 96a37f245..5fddadda0 100644 --- a/ios/RNSVGRenderable.m +++ b/ios/RNSVGRenderable.m @@ -6,6 +6,7 @@ * LICENSE file in the root directory of this source tree. */ +#import #import "RNSVGRenderable.h" #import "RNSVGClipPath.h" #import "RNSVGMask.h" @@ -518,7 +519,7 @@ - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event return nil; } - BOOL canReceiveTouchEvents = (([self isUserInteractionEnabled] || self.responsible) && ![self isHidden]); + BOOL canReceiveTouchEvents = (self.pointerEvents != RCTPointerEventsNone && ![self isHidden]); if(!canReceiveTouchEvents) { return nil; } diff --git a/ios/ViewManagers/RNSVGNodeManager.m b/ios/ViewManagers/RNSVGNodeManager.m index a33c57920..5667e5d7a 100644 --- a/ios/ViewManagers/RNSVGNodeManager.m +++ b/ios/ViewManagers/RNSVGNodeManager.m @@ -238,28 +238,7 @@ - (UIView *)view RCT_CUSTOM_VIEW_PROPERTY(pointerEvents, RCTPointerEvents, RNSVGNode) { - if (!json) { - view.userInteractionEnabled = defaultView.userInteractionEnabled; - return; - } - - switch ([RCTConvert RCTPointerEvents:json]) { - case RCTPointerEventsBoxNone: - case RCTPointerEventsBoxOnly: - case RCTPointerEventsUnspecified: - // Pointer events "unspecified" acts as if a stylesheet had not specified, - // which is different than "auto" in CSS (which cannot and will not be - // supported in `React`. "auto" may override a parent's "none". - // Unspecified values do not. - // This wouldn't override a container view's `userInteractionEnabled = NO` - view.userInteractionEnabled = YES; - break; - case RCTPointerEventsNone: - view.userInteractionEnabled = NO; - break; - default: - view.userInteractionEnabled = NO; - RCTLogError(@"UIView base class does not support pointerEvent value: %@", json); - } + view.pointerEvents = json ? [RCTConvert RCTPointerEvents:json] : defaultView.pointerEvents; } + @end