Add UIManager.measureInWindow to get window coordinates
Summary: When embedding in a hybrid app, we sometimes present new modal views or windows that have a different frame from the original root view. This API allows us to get coordinates in the application's window frame, which should be valid in any fullscreen view. Reviewed By: majak Differential Revision: D2939827 fb-gh-sync-id: 06b93cc2cb3519a25819c6efa445c779314dd673 shipit-source-id: 06b93cc2cb3519a25819c6efa445c779314dd673
This commit is contained in:
parent
d94a56747d
commit
f67fa82008
|
@ -27,6 +27,13 @@ type MeasureOnSuccessCallback = (
|
||||||
pageY: number
|
pageY: number
|
||||||
) => void
|
) => void
|
||||||
|
|
||||||
|
type MeasureInWindowOnSuccessCallback = (
|
||||||
|
x: number,
|
||||||
|
y: number,
|
||||||
|
width: number,
|
||||||
|
height: number,
|
||||||
|
) => void
|
||||||
|
|
||||||
type MeasureLayoutOnSuccessCallback = (
|
type MeasureLayoutOnSuccessCallback = (
|
||||||
left: number,
|
left: number,
|
||||||
top: number,
|
top: number,
|
||||||
|
@ -83,6 +90,28 @@ var NativeMethodsMixin = {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines the location of the given view in the window and returns the
|
||||||
|
* values via an async callback. If the React root view is embedded in
|
||||||
|
* another native view, this will give you the absolute coordinates. If
|
||||||
|
* successful, the callback will be called be called with the following
|
||||||
|
* arguments:
|
||||||
|
*
|
||||||
|
* - x
|
||||||
|
* - y
|
||||||
|
* - width
|
||||||
|
* - height
|
||||||
|
*
|
||||||
|
* Note that these measurements are not available until after the rendering
|
||||||
|
* has been completed in native.
|
||||||
|
*/
|
||||||
|
measureInWindow: function(callback: MeasureInWindowOnSuccessCallback) {
|
||||||
|
UIManager.measureInWindow(
|
||||||
|
findNodeHandle(this),
|
||||||
|
mountSafeCallback(this, callback)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Like [`measure()`](#measure), but measures the view relative an ancestor,
|
* Like [`measure()`](#measure), but measures the view relative an ancestor,
|
||||||
* specified as `relativeToNativeNode`. This means that the returned x, y
|
* specified as `relativeToNativeNode`. This means that the returned x, y
|
||||||
|
|
|
@ -1076,6 +1076,29 @@ RCT_EXPORT_METHOD(measure:(nonnull NSNumber *)reactTag
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RCT_EXPORT_METHOD(measureInWindow:(nonnull NSNumber *)reactTag
|
||||||
|
callback:(RCTResponseSenderBlock)callback)
|
||||||
|
{
|
||||||
|
[self addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
||||||
|
UIView *view = viewRegistry[reactTag];
|
||||||
|
if (!view) {
|
||||||
|
// this view was probably collapsed out
|
||||||
|
RCTLogWarn(@"measure cannot find view with tag #%@", reactTag);
|
||||||
|
callback(@[]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return frame coordinates in window
|
||||||
|
CGRect windowFrame = [view.window convertRect:view.frame fromView:view.superview];
|
||||||
|
callback(@[
|
||||||
|
@(windowFrame.origin.x),
|
||||||
|
@(windowFrame.origin.y),
|
||||||
|
@(windowFrame.size.width),
|
||||||
|
@(windowFrame.size.height),
|
||||||
|
]);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
static void RCTMeasureLayout(RCTShadowView *view,
|
static void RCTMeasureLayout(RCTShadowView *view,
|
||||||
RCTShadowView *ancestor,
|
RCTShadowView *ancestor,
|
||||||
RCTResponseSenderBlock callback)
|
RCTResponseSenderBlock callback)
|
||||||
|
|
Loading…
Reference in New Issue