Skip to content

Commit

Permalink
fix: #1290 pointerEvents="none"
Browse files Browse the repository at this point in the history
  • Loading branch information
msand committed Mar 5, 2020
1 parent d59d9dc commit bd78998
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 0 deletions.
5 changes: 5 additions & 0 deletions android/src/main/java/com/horcrux/svg/RenderableView.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableType;
import com.facebook.react.uimanager.PointerEvents;
import com.facebook.react.uimanager.annotations.ReactProp;

import java.lang.reflect.Field;
Expand Down Expand Up @@ -522,6 +523,10 @@ int hitTest(final float[] src) {
return -1;
}

if (mPointerEvents == PointerEvents.NONE) {
return -1;
}

float[] dst = new float[2];
mInvMatrix.mapPoints(dst, src);
mInvTransform.mapPoints(dst);
Expand Down
15 changes: 15 additions & 0 deletions android/src/main/java/com/horcrux/svg/RenderableViewManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,16 @@
import com.facebook.react.uimanager.LayoutShadowNode;
import com.facebook.react.uimanager.MatrixMathHelper;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.PointerEvents;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.TransformHelper;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.ViewProps;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.annotations.ReactPropGroup;

import java.util.Locale;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;

Expand Down Expand Up @@ -1230,6 +1234,17 @@ public void setResponsible(VirtualView node, boolean responsible) {
node.setResponsible(responsible);
}

@ReactProp(name = ViewProps.POINTER_EVENTS)
public void setPointerEvents(VirtualView view, @androidx.annotation.Nullable String pointerEventsStr) {
if (pointerEventsStr == null) {
view.setPointerEvents(PointerEvents.AUTO);
} else {
PointerEvents pointerEvents =
PointerEvents.valueOf(pointerEventsStr.toUpperCase(Locale.US).replace("-", "_"));
view.setPointerEvents(pointerEvents);
}
}

@ReactProp(name = "onLayout")
public void setOnLayout(VirtualView node, boolean onLayout) {
node.setOnLayout(onLayout);
Expand Down
6 changes: 6 additions & 0 deletions android/src/main/java/com/horcrux/svg/VirtualView.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.facebook.react.common.ReactConstants;
import com.facebook.react.uimanager.DisplayMetricsHolder;
import com.facebook.react.uimanager.OnLayoutEvent;
import com.facebook.react.uimanager.PointerEvents;
import com.facebook.react.uimanager.UIManagerModule;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.events.EventDispatcher;
Expand Down Expand Up @@ -102,6 +103,11 @@ abstract public class VirtualView extends ReactViewGroup {
Region mStrokeRegion;
Region mClipRegion;
ArrayList<PathElement> elements;
PointerEvents mPointerEvents;

void setPointerEvents(PointerEvents pointerEvents) {
mPointerEvents = pointerEvents;
}

@Override
public void invalidate() {
Expand Down
5 changes: 5 additions & 0 deletions ios/RNSVGRenderable.m
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,11 @@ - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
return nil;
}

BOOL canReceiveTouchEvents = (([self isUserInteractionEnabled] || self.responsible) && ![self isHidden]);
if(!canReceiveTouchEvents) {
return nil;
}

if (self.active) {
if (!event) {
self.active = NO;
Expand Down
26 changes: 26 additions & 0 deletions ios/ViewManagers/RNSVGNodeManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -236,4 +236,30 @@ - (UIView *)view

RCT_CUSTOM_SHADOW_PROPERTY(direction, id, RNSVGNode) {}

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);
}
}
@end

0 comments on commit bd78998

Please sign in to comment.