From e67811e7a6df0937ed61d3367ab10fab95b31bfa Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Tue, 23 Feb 2021 14:52:08 -0800 Subject: [PATCH] Fix RefreshControl layout when removed from window (#31024) Summary: Since iOS 14 refresh control is sometimes visible when it shouldn't. It seems to happen when it is removed and added back to the window. This repros easily when using react-native-screens with react-navigation tabs. Inactive tabs are detached from the window to save resources. Calling endRefreshing when refresh control is added to the window fixes the layout. It will also be called on first mount where it is not necessary, but should be a no-op and didn't cause any issues. I also decided to call it for all ios versions, although it is only needed on iOS 14+ to avoid forking behavior more. ## Changelog [iOS] [Fixed] - Fix RefreshControl layout when removed from window Pull Request resolved: https://github.com/facebook/react-native/pull/31024 Test Plan: Before: https://user-images.githubusercontent.com/2677334/108666197-93ea5a80-74a4-11eb-839b-8a4916967bf8.mov After: https://user-images.githubusercontent.com/2677334/108666223-9ea4ef80-74a4-11eb-8489-4e5d257299c8.mov Reviewed By: shergin Differential Revision: D26590759 Pulled By: PeteTheHeat fbshipit-source-id: b8c06068a24446b261cbeb88ff166289724031f1 --- React/Views/RefreshControl/RCTRefreshControl.m | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/React/Views/RefreshControl/RCTRefreshControl.m b/React/Views/RefreshControl/RCTRefreshControl.m index 1022b7896d8867..6985c38bce40b2 100644 --- a/React/Views/RefreshControl/RCTRefreshControl.m +++ b/React/Views/RefreshControl/RCTRefreshControl.m @@ -49,6 +49,18 @@ - (void)layoutSubviews _isInitialRender = false; } +- (void)didMoveToWindow +{ + [super didMoveToWindow]; + + // Since iOS 14 there seems to be a bug where refresh control becomes + // visible if the view gets removed from window then added back again. + // Calling endRefreshing fixes the layout. + if (!_currentRefreshingState) { + [super endRefreshing]; + } +} + - (void)beginRefreshingProgrammatically { UInt64 beginRefreshingTimestamp = _currentRefreshingStateTimestamp;