add to rn patch
This commit is contained in:
@@ -144,3 +144,168 @@ index 40aaf9c..1c60164 100644
|
|||||||
RCT_EXPORT_METHOD(setNativeRefreshing : (nonnull NSNumber *)viewTag toRefreshing : (BOOL)refreshing)
|
RCT_EXPORT_METHOD(setNativeRefreshing : (nonnull NSNumber *)viewTag toRefreshing : (BOOL)refreshing)
|
||||||
{
|
{
|
||||||
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
||||||
|
diff --git a/node_modules/react-native/React/Views/ScrollView/RCTScrollView.m b/node_modules/react-native/React/Views/ScrollView/RCTScrollView.m
|
||||||
|
index e9ce48c..c0e057d 100644
|
||||||
|
--- a/node_modules/react-native/React/Views/ScrollView/RCTScrollView.m
|
||||||
|
+++ b/node_modules/react-native/React/Views/ScrollView/RCTScrollView.m
|
||||||
|
@@ -159,26 +159,8 @@ - (BOOL)touchesShouldCancelInContentView:(__unused UIView *)view
|
||||||
|
return !shouldDisableScrollInteraction;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/*
|
||||||
|
- * Automatically centers the content such that if the content is smaller than the
|
||||||
|
- * ScrollView, we force it to be centered, but when you zoom or the content otherwise
|
||||||
|
- * becomes larger than the ScrollView, there is no padding around the content but it
|
||||||
|
- * can still fill the whole view.
|
||||||
|
- */
|
||||||
|
- (void)setContentOffset:(CGPoint)contentOffset
|
||||||
|
{
|
||||||
|
- UIView *contentView = [self contentView];
|
||||||
|
- if (contentView && _centerContent && !CGSizeEqualToSize(contentView.frame.size, CGSizeZero)) {
|
||||||
|
- CGSize subviewSize = contentView.frame.size;
|
||||||
|
- CGSize scrollViewSize = self.bounds.size;
|
||||||
|
- if (subviewSize.width <= scrollViewSize.width) {
|
||||||
|
- contentOffset.x = -(scrollViewSize.width - subviewSize.width) / 2.0;
|
||||||
|
- }
|
||||||
|
- if (subviewSize.height <= scrollViewSize.height) {
|
||||||
|
- contentOffset.y = -(scrollViewSize.height - subviewSize.height) / 2.0;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
super.contentOffset = CGPointMake(
|
||||||
|
RCTSanitizeNaNValue(contentOffset.x, @"scrollView.contentOffset.x"),
|
||||||
|
RCTSanitizeNaNValue(contentOffset.y, @"scrollView.contentOffset.y"));
|
||||||
|
@@ -338,6 +320,12 @@ - (void)_keyboardWillChangeFrame:(NSNotification *)notification
|
||||||
|
if (!didFocusExternalTextField && focusEnd > endFrame.origin.y) {
|
||||||
|
// Text field active region is below visible area with keyboard - update diff to bring into view
|
||||||
|
contentDiff = endFrame.origin.y - focusEnd;
|
||||||
|
+ } else {
|
||||||
|
+ UIView *inputAccessoryView = _firstResponderViewOutsideScrollView.inputAccessoryView;
|
||||||
|
+ if (inputAccessoryView) {
|
||||||
|
+ // Text input view is within the inputAccessoryView.
|
||||||
|
+ contentDiff = endFrame.origin.y - beginFrame.origin.y;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
} else if (endFrame.origin.y <= beginFrame.origin.y) {
|
||||||
|
// Keyboard opened for other reason
|
||||||
|
@@ -427,6 +415,11 @@ - (void)setRemoveClippedSubviews:(__unused BOOL)removeClippedSubviews
|
||||||
|
// Does nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
+- (void)setFrame:(CGRect)frame {
|
||||||
|
+ [super setFrame:frame];
|
||||||
|
+ [self centerContentIfNeeded];
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
- (void)insertReactSubview:(UIView *)view atIndex:(NSInteger)atIndex
|
||||||
|
{
|
||||||
|
[super insertReactSubview:view atIndex:atIndex];
|
||||||
|
@@ -444,6 +437,8 @@ - (void)insertReactSubview:(UIView *)view atIndex:(NSInteger)atIndex
|
||||||
|
RCTApplyTransformationAccordingLayoutDirection(_contentView, self.reactLayoutDirection);
|
||||||
|
[_scrollView addSubview:view];
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ [self centerContentIfNeeded];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)removeReactSubview:(UIView *)subview
|
||||||
|
@@ -594,6 +589,9 @@ - (void)scrollToOffset:(CGPoint)offset animated:(BOOL)animated
|
||||||
|
offset = CGPointMake(x, y);
|
||||||
|
}
|
||||||
|
[_scrollView setContentOffset:offset animated:animated];
|
||||||
|
+ if (animated) {
|
||||||
|
+ [self sendScrollEventWithName:@"onMomentumScrollBegin" scrollView:_scrollView userData:nil];
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -616,6 +614,9 @@ - (void)scrollToEnd:(BOOL)animated
|
||||||
|
// Ensure at least one scroll event will fire
|
||||||
|
_allowNextScrollNoMatterWhat = YES;
|
||||||
|
[_scrollView setContentOffset:offset animated:animated];
|
||||||
|
+ if (animated) {
|
||||||
|
+ [self sendScrollEventWithName:@"onMomentumScrollBegin" scrollView:_scrollView userData:nil];
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -652,9 +653,46 @@ -(void)delegateMethod : (UIScrollView *)scrollView \
|
||||||
|
}
|
||||||
|
|
||||||
|
RCT_SCROLL_EVENT_HANDLER(scrollViewWillBeginDecelerating, onMomentumScrollBegin)
|
||||||
|
-RCT_SCROLL_EVENT_HANDLER(scrollViewDidZoom, onScroll)
|
||||||
|
RCT_SCROLL_EVENT_HANDLER(scrollViewDidScrollToTop, onScrollToTop)
|
||||||
|
|
||||||
|
+-(void)scrollViewDidZoom : (UIScrollView *)scrollView
|
||||||
|
+{
|
||||||
|
+ [self centerContentIfNeeded];
|
||||||
|
+
|
||||||
|
+ RCT_SEND_SCROLL_EVENT(onScroll, nil);
|
||||||
|
+ RCT_FORWARD_SCROLL_EVENT(scrollViewDidZoom : scrollView);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Automatically centers the content such that if the content is smaller than the
|
||||||
|
+ * ScrollView, we force it to be centered, but when you zoom or the content otherwise
|
||||||
|
+ * becomes larger than the ScrollView, there is no padding around the content but it
|
||||||
|
+ * can still fill the whole view.
|
||||||
|
+ * This implementation is based on https://petersteinberger.com/blog/2013/how-to-center-uiscrollview/.
|
||||||
|
+ */
|
||||||
|
+-(void)centerContentIfNeeded
|
||||||
|
+{
|
||||||
|
+ if (!_scrollView.centerContent) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ CGSize contentSize = self.contentSize;
|
||||||
|
+ CGSize boundsSize = self.bounds.size;
|
||||||
|
+ if (CGSizeEqualToSize(contentSize, CGSizeZero) ||
|
||||||
|
+ CGSizeEqualToSize(boundsSize, CGSizeZero)) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ CGFloat top = 0, left = 0;
|
||||||
|
+ if (contentSize.width < boundsSize.width) {
|
||||||
|
+ left = (boundsSize.width - contentSize.width) * 0.5f;
|
||||||
|
+ }
|
||||||
|
+ if (contentSize.height < boundsSize.height) {
|
||||||
|
+ top = (boundsSize.height - contentSize.height) * 0.5f;
|
||||||
|
+ }
|
||||||
|
+ _scrollView.contentInset = UIEdgeInsetsMake(top, left, top, left);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
- (void)addScrollListener:(NSObject<UIScrollViewDelegate> *)scrollListener
|
||||||
|
{
|
||||||
|
[_scrollListeners addObject:scrollListener];
|
||||||
|
@@ -933,6 +971,7 @@ - (void)updateContentSizeIfNeeded
|
||||||
|
CGSize contentSize = self.contentSize;
|
||||||
|
if (!CGSizeEqualToSize(_scrollView.contentSize, contentSize)) {
|
||||||
|
_scrollView.contentSize = contentSize;
|
||||||
|
+ [self centerContentIfNeeded];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1055,6 +1094,23 @@ -(type)getter \
|
||||||
|
RCT_SET_AND_PRESERVE_OFFSET(setShowsVerticalScrollIndicator, showsVerticalScrollIndicator, BOOL)
|
||||||
|
RCT_SET_AND_PRESERVE_OFFSET(setZoomScale, zoomScale, CGFloat);
|
||||||
|
|
||||||
|
+- (void)setScrollIndicatorInsets:(UIEdgeInsets)value
|
||||||
|
+{
|
||||||
|
+ [_scrollView setScrollIndicatorInsets:value];
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+- (UIEdgeInsets)scrollIndicatorInsets
|
||||||
|
+{
|
||||||
|
+ UIEdgeInsets verticalScrollIndicatorInsets = [_scrollView verticalScrollIndicatorInsets];
|
||||||
|
+ UIEdgeInsets horizontalScrollIndicatorInsets = [_scrollView horizontalScrollIndicatorInsets];
|
||||||
|
+
|
||||||
|
+ return UIEdgeInsetsMake(
|
||||||
|
+ verticalScrollIndicatorInsets.top,
|
||||||
|
+ horizontalScrollIndicatorInsets.left,
|
||||||
|
+ verticalScrollIndicatorInsets.bottom,
|
||||||
|
+ horizontalScrollIndicatorInsets.right);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
- (void)setAutomaticallyAdjustsScrollIndicatorInsets:(BOOL)automaticallyAdjusts API_AVAILABLE(ios(13.0))
|
||||||
|
{
|
||||||
|
// `automaticallyAdjustsScrollIndicatorInsets` is available since iOS 13.
|
||||||
|
|||||||
Reference in New Issue
Block a user