diff --git a/React/Views/RCTRefreshControl.m b/React/Views/RCTRefreshControl.m index 37b3bb3baf7d61..bdb0fe65795bc3 100644 --- a/React/Views/RCTRefreshControl.m +++ b/React/Views/RCTRefreshControl.m @@ -14,6 +14,7 @@ @implementation RCTRefreshControl { BOOL _isInitialRender; BOOL _currentRefreshingState; + BOOL _refreshingProgrammatically; NSString *_title; UIColor *_titleColor; } @@ -48,8 +49,9 @@ - (void)layoutSubviews _isInitialRender = false; } -- (void)beginRefreshing +- (void)beginRefreshingProgrammatically { + _refreshingProgrammatically = YES; // When using begin refreshing we need to adjust the ScrollView content offset manually. UIScrollView *scrollView = (UIScrollView *)self.superview; CGPoint offset = {scrollView.contentOffset.x, scrollView.contentOffset.y - self.frame.size.height}; @@ -66,12 +68,12 @@ - (void)beginRefreshing }]; } -- (void)endRefreshing +- (void)endRefreshingProgrammatically { // The contentOffset of the scrollview MUST be greater than 0 before calling // endRefreshing otherwise the next pull to refresh will not work properly. UIScrollView *scrollView = (UIScrollView *)self.superview; - if (scrollView.contentOffset.y < 0) { + if (_refreshingProgrammatically && scrollView.contentOffset.y < 0) { CGPoint offset = {scrollView.contentOffset.x, 0}; [UIView animateWithDuration:0.25 delay:0 @@ -124,10 +126,10 @@ - (void)setRefreshing:(BOOL)refreshing if (refreshing) { if (!_isInitialRender) { - [self beginRefreshing]; + [self beginRefreshingProgrammatically]; } } else { - [self endRefreshing]; + [self endRefreshingProgrammatically]; } } } @@ -135,6 +137,7 @@ - (void)setRefreshing:(BOOL)refreshing - (void)refreshControlValueChanged { _currentRefreshingState = super.refreshing; + _refreshingProgrammatically = NO; if (_onRefresh) { _onRefresh(nil);