mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-02 09:21:44 +08:00
RefreshControl doesn't render when initial refreshing state is true
Summary:
Example (index.ios.js):
```
'use strict';
import React from 'react';
import {ListView, RefreshControl, Text, View} from 'react-native';
class BugExample extends React.Component {
render() {
return (
<ListView
style={{backgroundColor: 'red'}}
contentContainerStyle={{backgroundColor: 'green'}}
refreshControl={
<RefreshControl
refreshing={true}
onRefresh={() => {}}
/>
}
dataSource={
new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}).cloneWithRows(['a', 'b', 'c'])
}
renderRow={(item) => {
return (
<View>
<Text>{item}</Text>
</View>
);
}}
/>
);
}
}
```
RN version: 0.34, 0.35-rc
iOS version (emulator): 9.
Closes https://github.com/facebook/react-native/pull/10321
Differential Revision: D4142774
Pulled By: mmmulani
fbshipit-source-id: 743b865a6e1c1fb09c7cfc48631ad383bd593f89
This commit is contained in:
committed by
Facebook Github Bot
parent
4d35f65eb7
commit
3eeaffce1a
@@ -12,7 +12,6 @@
|
||||
#import "RCTUtils.h"
|
||||
|
||||
@implementation RCTRefreshControl {
|
||||
BOOL _initialRefreshingState;
|
||||
BOOL _isInitialRender;
|
||||
BOOL _currentRefreshingState;
|
||||
}
|
||||
@@ -41,7 +40,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
||||
|
||||
// If the control is refreshing when mounted we need to call
|
||||
// beginRefreshing in layoutSubview or it doesn't work.
|
||||
if (_currentRefreshingState && _isInitialRender && _initialRefreshingState) {
|
||||
if (_currentRefreshingState && _isInitialRender) {
|
||||
[self beginRefreshing];
|
||||
}
|
||||
_isInitialRender = false;
|
||||
@@ -52,14 +51,10 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
||||
// 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};
|
||||
// Don't animate when the prop is set initialy.
|
||||
if (_isInitialRender) {
|
||||
scrollView.contentOffset = offset;
|
||||
[super beginRefreshing];
|
||||
} else {
|
||||
// `beginRefreshing` must be called after the animation is done. This is why it is impossible
|
||||
// to use `setContentOffset` with `animated:YES`.
|
||||
[UIView animateWithDuration:0.25
|
||||
|
||||
// `beginRefreshing` must be called after the animation is done. This is why it is impossible
|
||||
// to use `setContentOffset` with `animated:YES`.
|
||||
[UIView animateWithDuration:0.25
|
||||
delay:0
|
||||
options:UIViewAnimationOptionBeginFromCurrentState
|
||||
animations:^(void) {
|
||||
@@ -67,7 +62,6 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
||||
} completion:^(__unused BOOL finished) {
|
||||
[super beginRefreshing];
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)endRefreshing
|
||||
@@ -117,11 +111,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
||||
_currentRefreshingState = refreshing;
|
||||
|
||||
if (refreshing) {
|
||||
// If it is the initial render, beginRefreshing will get called
|
||||
// in layoutSubviews.
|
||||
if (_isInitialRender) {
|
||||
_initialRefreshingState = refreshing;
|
||||
} else {
|
||||
if (!_isInitialRender) {
|
||||
[self beginRefreshing];
|
||||
}
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user