mirror of
https://github.com/zhigang1992/react-navigation.git
synced 2026-04-29 21:05:29 +08:00
This commit adds a check to detect if the screen content fills the available body, and if yes, then it adjusts the styles so that scrolling triggers a scroll on the body which hides the address bar in browser.
Tested on Safari in iOS and Chrome on Android.
This behaviour can be overriden by the user by specifying `cardStyle: { flex: 1 }`, which will keep both the header and the address bar always visible.
64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import * as React from 'react';
|
|
import { Platform, StyleSheet, View } from 'react-native';
|
|
// eslint-disable-next-line import/no-unresolved
|
|
import { Screen, screensEnabled } from 'react-native-screens';
|
|
|
|
type Props = {
|
|
isVisible: boolean;
|
|
children: React.ReactNode;
|
|
style?: any;
|
|
};
|
|
|
|
const FAR_FAR_AWAY = 30000; // this should be big enough to move the whole view out of its container
|
|
|
|
export default class ResourceSavingScene extends React.Component<Props> {
|
|
render() {
|
|
// react-native-screens is buggy on web
|
|
if (screensEnabled?.() && Platform.OS !== 'web') {
|
|
const { isVisible, ...rest } = this.props;
|
|
|
|
// @ts-ignore
|
|
return <Screen active={isVisible ? 1 : 0} {...rest} />;
|
|
}
|
|
|
|
const { isVisible, children, style, ...rest } = this.props;
|
|
|
|
return (
|
|
<View
|
|
style={[
|
|
styles.container,
|
|
Platform.OS === 'web'
|
|
? { display: isVisible ? 'flex' : 'none' }
|
|
: { overflow: 'hidden' },
|
|
style,
|
|
]}
|
|
collapsable={false}
|
|
removeClippedSubviews={
|
|
// On iOS, set removeClippedSubviews to true only when not focused
|
|
// This is an workaround for a bug where the clipped view never re-appears
|
|
Platform.OS === 'ios' ? !isVisible : true
|
|
}
|
|
pointerEvents={isVisible ? 'auto' : 'none'}
|
|
{...rest}
|
|
>
|
|
<View style={isVisible ? styles.attached : styles.detached}>
|
|
{children}
|
|
</View>
|
|
</View>
|
|
);
|
|
}
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
},
|
|
attached: {
|
|
flex: 1,
|
|
},
|
|
detached: {
|
|
flex: 1,
|
|
top: FAR_FAR_AWAY,
|
|
},
|
|
});
|