diff --git a/ios/BottomTabsAfterInitialTabAttacher.mm b/ios/BottomTabsAfterInitialTabAttacher.mm index 16ff862f3f..96058ddabb 100644 --- a/ios/BottomTabsAfterInitialTabAttacher.mm +++ b/ios/BottomTabsAfterInitialTabAttacher.mm @@ -9,6 +9,10 @@ - (void)attach:(UITabBarController *)bottomTabsController { for (UIViewController *viewController in bottomTabsController.deselectedViewControllers) { dispatch_async(dispatch_get_main_queue(), ^{ UIWindow *preloadWindow = [[UIWindow alloc] initWithFrame:CGRectZero]; + // Clip the preload window so the deselected tab's full-screen reactView, + // which is briefly hosted here while it renders, can't draw outside the + // zero-frame window and flicker over the already-visible selected tab. + preloadWindow.clipsToBounds = YES; preloadWindow.hidden = NO; dispatch_group_t ready = dispatch_group_create(); diff --git a/ios/BottomTabsTogetherAttacher.mm b/ios/BottomTabsTogetherAttacher.mm index 2b90e7eb0d..cbd886f5dc 100644 --- a/ios/BottomTabsTogetherAttacher.mm +++ b/ios/BottomTabsTogetherAttacher.mm @@ -7,6 +7,10 @@ - (void)attach:(RNNBottomTabsController *)bottomTabsController { dispatch_group_t ready = dispatch_group_create(); UIWindow *preloadWindow = [[UIWindow alloc] initWithFrame:CGRectZero]; + // Clip the preload window so the full-screen reactViews hosted here while + // they render can't draw outside the zero-frame window. Today the splash + // screen masks this, but without clipping it's a latent flicker. + preloadWindow.clipsToBounds = YES; preloadWindow.hidden = NO; NSMapTable *reactViewToParent = [NSMapTable strongToStrongObjectsMapTable];