mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
iOS: Fix refreshControl layouting (#28236)
Summary: In `react-native-navigation` we allow the usage of native iOS navigationBar **largeTitle** which cause the title to "jump" when pulling to refresh. We found that the layout calculations of the refreshControl element mess up the system behaviour. ## Changelog [iOS] [Fixed] - Fix refreshControl messes up navigationBar largeTitles Pull Request resolved: https://github.com/facebook/react-native/pull/28236 Test Plan: ### Before the fix:  ### And after:  ### How it looks like with react-native init app after the fix:  Differential Revision: D20587945 Pulled By: shergin fbshipit-source-id: 94f560b17e367f4ef5e789f40c052396949b51a3
This commit is contained in:
1 parent
26d3bcae72
commit
702ff6d1cd
2 files changed
+4
-20
No files matched your search
@@ -41,12 +41,6 @@ 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) {
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
@property (nonatomic, assign) BOOL centerContent;
|
||||
#if !TARGET_OS_TV
|
||||
@property (nonatomic, strong) UIView<RCTCustomRefreshContolProtocol> *customRefreshControl;
|
||||
@property (nonatomic, strong) UIRefreshControl<RCTCustomRefreshContolProtocol> *customRefreshControl;
|
||||
@property (nonatomic, assign) BOOL pinchGestureEnabled;
|
||||
#endif
|
||||
|
||||
@@ -224,13 +224,13 @@
|
||||
}
|
||||
|
||||
#if !TARGET_OS_TV
|
||||
- (void)setCustomRefreshControl:(UIView<RCTCustomRefreshContolProtocol> *)refreshControl
|
||||
- (void)setCustomRefreshControl:(UIRefreshControl<RCTCustomRefreshContolProtocol> *)refreshControl
|
||||
{
|
||||
if (_customRefreshControl) {
|
||||
[_customRefreshControl removeFromSuperview];
|
||||
}
|
||||
_customRefreshControl = refreshControl;
|
||||
[self addSubview:_customRefreshControl];
|
||||
self.refreshControl = refreshControl;
|
||||
}
|
||||
|
||||
- (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:(UIView<RCTCustomRefreshContolProtocol> *)view];
|
||||
[_scrollView setCustomRefreshControl:(UIRefreshControl<RCTCustomRefreshContolProtocol> *)view];
|
||||
if (![view isKindOfClass:[UIRefreshControl class]] && [view conformsToProtocol:@protocol(UIScrollViewDelegate)]) {
|
||||
[self addScrollListener:(UIView<UIScrollViewDelegate> *)view];
|
||||
}
|
||||
@@ -418,16 +418,6 @@ 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<RCTCustomRefreshContolProtocol> *refreshControl = _scrollView.customRefreshControl;
|
||||
if (refreshControl && refreshControl.isRefreshing) {
|
||||
refreshControl.frame =
|
||||
(CGRect){_scrollView.contentOffset, {_scrollView.frame.size.width, refreshControl.frame.size.height}};
|
||||
}
|
||||
#endif
|
||||
|
||||
[self updateClippedSubviews];
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user