From 79bc7f9fad78e15cacadd8426bd33bf5f571a192 Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Tue, 28 Apr 2020 13:06:06 -0700 Subject: [PATCH] Revert D20587945: iOS: Fix refreshControl layouting Differential Revision: D20587945 Original commit changeset: 94f560b17e36 fbshipit-source-id: e8ec95b2ea8632ef09e132351a1458cf97671206 --- React/Views/RefreshControl/RCTRefreshControl.m | 6 ++++++ React/Views/ScrollView/RCTScrollView.m | 18 ++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/React/Views/RefreshControl/RCTRefreshControl.m b/React/Views/RefreshControl/RCTRefreshControl.m index 419535bcb46..428a5e7fa40 100644 --- a/React/Views/RefreshControl/RCTRefreshControl.m +++ b/React/Views/RefreshControl/RCTRefreshControl.m @@ -41,6 +41,12 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder) { [super layoutSubviews]; + // Fix for bug #7976 + // TODO: Remove when updating to use iOS 10 refreshControl UIScrollView prop. + if (self.backgroundColor == nil) { + self.backgroundColor = [UIColor clearColor]; + } + // If the control is refreshing when mounted we need to call // beginRefreshing in layoutSubview or it doesn't work. if (_currentRefreshingState && _isInitialRender) { diff --git a/React/Views/ScrollView/RCTScrollView.m b/React/Views/ScrollView/RCTScrollView.m index bb49c8d7363..56d63505b9e 100644 --- a/React/Views/ScrollView/RCTScrollView.m +++ b/React/Views/ScrollView/RCTScrollView.m @@ -32,7 +32,7 @@ @property (nonatomic, assign) BOOL centerContent; #if !TARGET_OS_TV -@property (nonatomic, strong) UIRefreshControl *customRefreshControl; +@property (nonatomic, strong) UIView *customRefreshControl; @property (nonatomic, assign) BOOL pinchGestureEnabled; #endif @@ -224,13 +224,13 @@ } #if !TARGET_OS_TV -- (void)setCustomRefreshControl:(UIRefreshControl *)refreshControl +- (void)setCustomRefreshControl:(UIView *)refreshControl { if (_customRefreshControl) { [_customRefreshControl removeFromSuperview]; } _customRefreshControl = refreshControl; - self.refreshControl = refreshControl; + [self addSubview:_customRefreshControl]; } - (void)setPinchGestureEnabled:(BOOL)pinchGestureEnabled @@ -344,7 +344,7 @@ static inline void RCTApplyTransformationAccordingLayoutDirection( [super insertReactSubview:view atIndex:atIndex]; #if !TARGET_OS_TV if ([view conformsToProtocol:@protocol(RCTCustomRefreshContolProtocol)]) { - [_scrollView setCustomRefreshControl:(UIRefreshControl *)view]; + [_scrollView setCustomRefreshControl:(UIView *)view]; if (![view isKindOfClass:[UIRefreshControl class]] && [view conformsToProtocol:@protocol(UIScrollViewDelegate)]) { [self addScrollListener:(UIView *)view]; } @@ -418,6 +418,16 @@ static inline void RCTApplyTransformationAccordingLayoutDirection( [super layoutSubviews]; RCTAssert(self.subviews.count == 1, @"we should only have exactly one subview"); RCTAssert([self.subviews lastObject] == _scrollView, @"our only subview should be a scrollview"); + +#if !TARGET_OS_TV + // Adjust the refresh control frame if the scrollview layout changes. + UIView *refreshControl = _scrollView.customRefreshControl; + if (refreshControl && refreshControl.isRefreshing) { + refreshControl.frame = + (CGRect){_scrollView.contentOffset, {_scrollView.frame.size.width, refreshControl.frame.size.height}}; + } +#endif + [self updateClippedSubviews]; }