mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Fix Issue 10718: Add iOS support for progressViewOffset (#30737)
Summary: Fixes https://github.com/facebook/react-native/issues/10718, bringing `progressViewOffset` support to iOS. Thanks to Taylor123 for the initial PR upon which this fix is based. ## Changelog [iOS] [Fix] - `progressViewOffset` prop of `RefreshControl` and `VirtualizedList` now works on iOS Pull Request resolved: https://github.com/facebook/react-native/pull/30737 Test Plan: Tested with quick-and-dirty sample app.  ## Documentation The corresponding documentation update PR can be found [here](https://github.com/facebook/react-native-website/pull/2441). Reviewed By: kacieb Differential Revision: D26813977 Pulled By: sammy-SC fbshipit-source-id: 45cc5a647d70e44a29c6391b7586cb41ca011bef
This commit is contained in:
committed by
Facebook GitHub Bot
parent
896baf79d5
commit
310a6bcf4b
@@ -8,7 +8,11 @@
|
||||
* @flow strict-local
|
||||
*/
|
||||
|
||||
import type {DirectEventHandler, WithDefault} from '../../Types/CodegenTypes';
|
||||
import type {
|
||||
DirectEventHandler,
|
||||
Float,
|
||||
WithDefault,
|
||||
} from '../../Types/CodegenTypes';
|
||||
import type {ColorValue} from '../../StyleSheet/StyleSheet';
|
||||
import type {ViewProps} from '../View/ViewPropTypes';
|
||||
import * as React from 'react';
|
||||
@@ -32,6 +36,10 @@ type NativeProps = $ReadOnly<{|
|
||||
* The title displayed under the refresh indicator.
|
||||
*/
|
||||
title?: WithDefault<string, null>,
|
||||
/**
|
||||
* Progress view top offset
|
||||
*/
|
||||
progressViewOffset?: WithDefault<Float, 0>,
|
||||
|
||||
/**
|
||||
* Called when the view starts refreshing.
|
||||
|
||||
@@ -52,10 +52,6 @@ type AndroidProps = $ReadOnly<{|
|
||||
* Size of the refresh indicator.
|
||||
*/
|
||||
size?: ?('default' | 'large'),
|
||||
/**
|
||||
* Progress view top offset
|
||||
*/
|
||||
progressViewOffset?: ?number,
|
||||
|}>;
|
||||
|
||||
export type RefreshControlProps = $ReadOnly<{|
|
||||
@@ -72,6 +68,11 @@ export type RefreshControlProps = $ReadOnly<{|
|
||||
* Whether the view should be indicating an active refresh.
|
||||
*/
|
||||
refreshing: boolean,
|
||||
|
||||
/**
|
||||
* Progress view top offset
|
||||
*/
|
||||
progressViewOffset?: ?number,
|
||||
|}>;
|
||||
|
||||
/**
|
||||
@@ -162,7 +163,6 @@ class RefreshControl extends React.Component<RefreshControlProps> {
|
||||
colors,
|
||||
progressBackgroundColor,
|
||||
size,
|
||||
progressViewOffset,
|
||||
...props
|
||||
} = this.props;
|
||||
return (
|
||||
|
||||
@@ -246,7 +246,6 @@ type OptionalProps = {|
|
||||
persistentScrollbar?: ?boolean,
|
||||
/**
|
||||
* Set this when offset is needed for the loading indicator to show correctly.
|
||||
* @platform android
|
||||
*/
|
||||
progressViewOffset?: number,
|
||||
/**
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
BOOL _refreshingProgrammatically;
|
||||
NSString *_title;
|
||||
UIColor *_titleColor;
|
||||
CGFloat _progressViewOffset;
|
||||
}
|
||||
|
||||
- (instancetype)init
|
||||
@@ -40,6 +41,7 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder)
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
[super layoutSubviews];
|
||||
[self _applyProgressViewOffset];
|
||||
|
||||
// If the control is refreshing when mounted we need to call
|
||||
// beginRefreshing in layoutSubview or it doesn't work.
|
||||
@@ -120,6 +122,19 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder)
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_applyProgressViewOffset
|
||||
{
|
||||
// progressViewOffset must be converted from the ScrollView parent's coordinate space to
|
||||
// the coordinate space of the RefreshControl. This ensures that the control respects any
|
||||
// offset in the view hierarchy, and that progressViewOffset is not inadvertently applied
|
||||
// multiple times.
|
||||
UIView *scrollView = self.superview;
|
||||
UIView *target = scrollView.superview;
|
||||
CGPoint rawOffset = CGPointMake(0, _progressViewOffset);
|
||||
CGPoint converted = [self convertPoint:rawOffset fromView:target];
|
||||
self.frame = CGRectOffset(self.frame, 0, converted.y);
|
||||
}
|
||||
|
||||
- (NSString *)title
|
||||
{
|
||||
return _title;
|
||||
@@ -172,6 +187,12 @@ RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder)
|
||||
_currentRefreshingStateTimestamp = _currentRefreshingStateClock++;
|
||||
}
|
||||
|
||||
- (void)setProgressViewOffset:(CGFloat)offset
|
||||
{
|
||||
_progressViewOffset = offset;
|
||||
[self _applyProgressViewOffset];
|
||||
}
|
||||
|
||||
- (void)refreshControlValueChanged
|
||||
{
|
||||
[self setCurrentRefreshingState:super.refreshing];
|
||||
|
||||
@@ -25,6 +25,7 @@ RCT_EXPORT_VIEW_PROPERTY(refreshing, BOOL)
|
||||
RCT_EXPORT_VIEW_PROPERTY(tintColor, UIColor)
|
||||
RCT_EXPORT_VIEW_PROPERTY(title, NSString)
|
||||
RCT_EXPORT_VIEW_PROPERTY(titleColor, UIColor)
|
||||
RCT_EXPORT_VIEW_PROPERTY(progressViewOffset, CGFloat)
|
||||
|
||||
RCT_EXPORT_METHOD(setNativeRefreshing : (nonnull NSNumber *)viewTag toRefreshing : (BOOL)refreshing)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user