-
-
Notifications
You must be signed in to change notification settings - Fork 623
Expand file tree
/
Copy pathRNSContentScrollViewDetector.mm
More file actions
101 lines (79 loc) · 2.5 KB
/
RNSContentScrollViewDetector.mm
File metadata and controls
101 lines (79 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#import "RNSContentScrollViewDetector.h"
#import <React/RCTLog.h>
#import <react/renderer/components/rnscreens/ComponentDescriptors.h>
namespace react = facebook::react;
@implementation RNSContentScrollViewDetector {
UIScrollView *_scrollView;
UIView *_linkedView;
}
- (void)didMoveToWindow
{
if (self.window == nil) {
[self unregisterContentScrollViewInHierarchy];
} else {
if ((_scrollView = [self findContentScrollView])) {
[self registerContentScrollViewInHierarchy];
}
}
}
- (UIScrollView *)findContentScrollView
{
auto scrollView = [RNSScrollViewFinder findScrollViewInFirstDescendantChainFrom:self];
if (scrollView) {
RCTLogInfo(@"Found content ScrollView");
return scrollView;
}
return nullptr;
}
- (void)registerContentScrollViewInHierarchy
{
if (_linkedView != nullptr) {
RCTLogWarn(
@"Content ScrollView has already been registered. Make sure to only have one ScrollViewWrapper for content ScrollView.");
[self unregisterContentScrollViewInHierarchy];
}
UIView *parent = self.superview;
while (parent) {
if ([parent respondsToSelector:@selector(findContentScrollView)]) {
RCTLogWarn(
@"Nested ScrollViewWrapper detected. Make sure to only have one ScrollViewWrapper for content ScrollView.");
}
if ([parent respondsToSelector:@selector(registerContentScrollView:)]) {
[(id<ContentScrollViewConsumer>)parent registerContentScrollView:_scrollView];
_linkedView = parent;
RCTLogInfo(@"registered content ScrollView for: %@", parent);
break;
}
parent = parent.superview;
}
}
- (void)unregisterContentScrollViewInHierarchy
{
if (_linkedView == nullptr) {
return;
}
[(id<ContentScrollViewConsumer>)_linkedView unregisterContentScrollView:_scrollView];
RCTLogInfo(@"unregistered content ScrollView for: %@", _linkedView);
_linkedView = nullptr;
}
#pragma mark - RCTViewComponentViewProtocol
+ (react::ComponentDescriptorProvider)componentDescriptorProvider
{
return react::concreteComponentDescriptorProvider<react::RNSContentScrollViewDetectorComponentDescriptor>();
}
@end
#if RCT_NEW_ARCH_ENABLED
Class<RCTComponentViewProtocol> RNSContentScrollViewDetectorCls(void)
{
return RNSContentScrollViewDetector.class;
}
#endif // RCT_NEW_ARCH_ENABLED
#if !RCT_NEW_ARCH_ENABLED
@implementation RNSContentScrollViewDetectorViewManager
RCT_EXPORT_MODULE(RNSContentScrollViewDetector);
- (UIView *)view
{
return [[RNSContentScrollViewDetector alloc] init];
}
@end
#endif // !RCT_NEW_ARCH_ENABLED