From f03f119f0e100ef44910e15d305f4c0d6795fc74 Mon Sep 17 00:00:00 2001 From: Pritesh Nandgaonkar Date: Wed, 4 Mar 2020 06:42:39 -0800 Subject: [PATCH] Fix the broken target selector Summary: The target selector was broken on iOS. The overlay view which has the gesture recognizer, was never added to the window, due to which the gestures were not registered and the feature broke. This diff adds the overlay view in the window object as the subview and then discards it in its view descriptor as otherwise we will capture all our touches in this view. This was the most popular bug in our research trip and almost everyone reported it. Reviewed By: fabiomassimo Differential Revision: D20225594 fbshipit-source-id: af4041859d7e662152b2575d1eb258dd0c2d990e --- .../FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm | 2 +- .../FlipperKitLayoutPlugin/SKTapListenerImpl.m | 5 ++--- .../FlipperKitLayoutPlugin/descriptors/SKViewDescriptor.mm | 6 +++++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm index d64db0b0d..b18ba146d 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.mm @@ -362,7 +362,7 @@ if (active) { [_tapListener mountWithFrame:[[UIScreen mainScreen] bounds]]; __block id rootNode = _rootNode; - + [_tapListener listenForTapWithBlock:^(CGPoint touchPoint) { SKTouch* touch = [[SKTouch alloc] initWithTouchPoint:touchPoint diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKTapListenerImpl.m b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKTapListenerImpl.m index c52b2ae15..0ae3aaffa 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKTapListenerImpl.m +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKTapListenerImpl.m @@ -36,7 +36,7 @@ _overlayWindow.hidden = YES; _overlayWindow.windowLevel = UIWindowLevelAlert; _overlayWindow.backgroundColor = [SKHighlightOverlay overlayColor]; - + [_overlayWindow addGestureRecognizer:_gestureRecognizer]; } @@ -51,7 +51,7 @@ [_overlayWindow setFrame:frame]; [_overlayWindow makeKeyAndVisible]; _overlayWindow.hidden = NO; - + [[UIApplication sharedApplication].delegate.window addSubview:_overlayWindow]; _isMounted = YES; } @@ -63,7 +63,6 @@ [_receiversWaitingForInput removeAllObjects]; [_overlayWindow removeFromSuperview]; _overlayWindow.hidden = YES; - _isMounted = NO; } diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/descriptors/SKViewDescriptor.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/descriptors/SKViewDescriptor.mm index a6d9e1f1a..7ad170dbd 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/descriptors/SKViewDescriptor.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/descriptors/SKViewDescriptor.mm @@ -12,6 +12,7 @@ #import #import #import "SKDescriptorMapper.h" +#import "SKHiddenWindow.h" #import "SKNamed.h" #import "SKObject.h" #import "SKYogaKitHelper.h" @@ -492,7 +493,10 @@ static NSDictionary* YGUnitEnumMap = nil; viewForNode = (UIView*)childNode; } - if (viewForNode.isHidden || viewForNode.alpha <= 0) { + if (viewForNode.isHidden || viewForNode.alpha <= 0 || + [[viewForNode class] isEqual:[SKHiddenWindow class]]) { + /*SKHiddenWindow is the pink overlay which is added in window to capture + the gestures.*/ continue; }