Skip to content
This repository was archived by the owner on Nov 23, 2020. It is now read-only.

Commit 6b1063f

Browse files
committed
feat: popover 添加通过 nativeID 定位元素功能
1 parent 7f0e9f3 commit 6b1063f

File tree

4 files changed

+47
-28
lines changed

4 files changed

+47
-28
lines changed

RNPopoverIOS.ios.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ export default class extends Component {
6161
* The `sourceViewGetterTag` prop is the tag of The view getter which containing the anchor rectangle for the popover
6262
*/
6363
sourceViewGetterTag: PropTypes.number,
64+
/**
65+
* The `sourceViewNativeID` prop is the nativeID of The view containing the anchor rectangle for the popover
66+
*/
67+
sourceViewNativeID: PropTypes.string,
6468
/**
6569
* The `sourceRect` prop is the rectangle in the specified view in which to anchor the popover.
6670
*/
@@ -87,7 +91,7 @@ export default class extends Component {
8791
/**
8892
* The `onHide` prop allows passing a function that will be called once the popover has been hidden.
8993
*/
90-
onHide: PropTypes.func,
94+
onHide: PropTypes.func
9195
};
9296

9397
static defaultProps = {

ios/RNPopoverHostView.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@
4444
*/
4545
@property (nonatomic, assign) NSInteger sourceViewGetterTag;
4646

47+
/**
48+
nativeID for the native view containing the anchor rectangle for the popover.
49+
*/
50+
@property (nonatomic, assign) NSString *sourceViewNativeID;
51+
4752
/**
4853
reactTag for the react view containing the anchor rectangle for the popover.
4954

ios/RNPopoverHostView.m

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -103,25 +103,26 @@ - (void)didMoveToWindow {
103103
_initialized = YES;
104104
_popoverHostViewController.view.backgroundColor = _popoverBackgroundColor;
105105

106-
UIView *sourceView = [self autoGetSourceView];
107-
if (!sourceView) {
108-
NSLog(@"sourceView is invalid");
109-
if (_onHide) {
110-
_onHide(nil);
106+
[self autoGetSourceView:^(UIView *sourceView) {
107+
if (!sourceView) {
108+
NSLog(@"sourceView is invalid");
109+
if (_onHide) {
110+
_onHide(nil);
111+
}
112+
return;
111113
}
112-
return;
113-
}
114-
_presented = YES;
115-
[self updateContentSize];
116-
_popoverHostViewController.popoverPresentationController.sourceView = sourceView;
117-
_popoverHostViewController.popoverPresentationController.sourceRect = CGRectEqualToRect(_realSourceRect, CGRectNull) ? sourceView.bounds : _realSourceRect;
118-
_popoverHostViewController.popoverPresentationController.backgroundColor = _popoverBackgroundColor;
119-
_popoverHostViewController.popoverPresentationController.permittedArrowDirections = [self getPermittedArrowDirections];
120-
if (!CGSizeEqualToSize(CGSizeZero, _realPreferredContentSize)) {
121-
_popoverHostViewController.preferredContentSize = _realPreferredContentSize;
122-
}
123-
124-
[_delegate presentPopoverHostView:self withViewController:_popoverHostViewController animated:_animated];
114+
_presented = YES;
115+
[self updateContentSize];
116+
_popoverHostViewController.popoverPresentationController.sourceView = sourceView;
117+
_popoverHostViewController.popoverPresentationController.sourceRect = CGRectEqualToRect(_realSourceRect, CGRectNull) ? sourceView.bounds : _realSourceRect;
118+
_popoverHostViewController.popoverPresentationController.backgroundColor = _popoverBackgroundColor;
119+
_popoverHostViewController.popoverPresentationController.permittedArrowDirections = [self getPermittedArrowDirections];
120+
if (!CGSizeEqualToSize(CGSizeZero, _realPreferredContentSize)) {
121+
_popoverHostViewController.preferredContentSize = _realPreferredContentSize;
122+
}
123+
124+
[_delegate presentPopoverHostView:self withViewController:_popoverHostViewController animated:_animated];
125+
}];
125126
}
126127
}
127128

@@ -201,16 +202,24 @@ - (void)updateContentSize {
201202
});
202203
}
203204

204-
- (UIView *)autoGetSourceView {
205-
UIView *sourceView = nil;
206-
if (_sourceViewReactTag >= 0) {
207-
sourceView = [_bridge.uiManager viewForReactTag:@(_sourceViewReactTag)];
208-
} else if (_sourceViewTag >= 0) {
209-
sourceView = [[RNPopoverTargetManager getInstance] viewForTag:_sourceViewTag];
210-
} else if (_sourceViewGetterTag >= 0) {
211-
sourceView = [[RNPopoverTargetManager getInstance] viewForGetterTag:_sourceViewGetterTag];
205+
- (void)autoGetSourceView:(void (^)(UIView *view))completion {
206+
if (_sourceViewNativeID) {
207+
__block NSString *nativeID = _sourceViewNativeID;
208+
[_bridge.uiManager rootViewForReactTag:self.reactTag withCompletion:^(UIView *view) {
209+
completion([_bridge.uiManager viewForNativeID:nativeID withRootTag:view.reactTag]);
210+
}];
211+
} else {
212+
UIView *sourceView = nil;
213+
if (_sourceViewReactTag >= 0) {
214+
sourceView = [_bridge.uiManager viewForReactTag:@(_sourceViewReactTag)];
215+
} else if (_sourceViewTag >= 0) {
216+
sourceView = [[RNPopoverTargetManager getInstance] viewForTag:_sourceViewTag];
217+
} else if (_sourceViewGetterTag >= 0) {
218+
sourceView = [[RNPopoverTargetManager getInstance] viewForGetterTag:_sourceViewGetterTag];
219+
}
220+
completion(sourceView);
212221
}
213-
return sourceView;
222+
214223
}
215224

216225
#pragma mark - Setter

ios/RNPopoverHostViewManager.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ @implementation RNPopoverHostViewManager {
3434
RCT_EXPORT_VIEW_PROPERTY(popoverBackgroundColor, UIColor)
3535
RCT_EXPORT_VIEW_PROPERTY(sourceViewReactTag, NSInteger)
3636
RCT_EXPORT_VIEW_PROPERTY(sourceViewTag, NSInteger)
37+
RCT_EXPORT_VIEW_PROPERTY(sourceViewNativeID, NSString)
3738
RCT_EXPORT_VIEW_PROPERTY(sourceViewGetterTag, NSInteger)
3839
RCT_EXPORT_VIEW_PROPERTY(sourceRect, NSArray)
3940
RCT_EXPORT_VIEW_PROPERTY(permittedArrowDirections, NSArray)

0 commit comments

Comments
 (0)