Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 18 additions & 14 deletions Libraries/Components/Keyboard/KeyboardAvoidingView.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,19 @@ type KeyboardChangeEvent = {
const viewRef = 'VIEW';

/**
* It is a component to solve the common problem of views that need to move out of the way of the virtual keyboard.
* It can automatically adjust either its position or bottom padding based on the position of the keyboard.
* This is a component to solve the common problem of views that need to move out of the way of the virtual keyboard.
* It can automatically adjust either its height, position or bottom padding based on the position of the keyboard.
*/
const KeyboardAvoidingView = createReactClass({
displayName: 'KeyboardAvoidingView',
mixins: [TimerMixin],

propTypes: {
...ViewPropTypes,
/**
* Specify how the `KeyboardAvoidingView` will react to the presence of
* the keyboard. It can adjust the height, position or bottom padding of the view
*/
behavior: PropTypes.oneOf(['height', 'position', 'padding']),

/**
Expand All @@ -61,7 +65,7 @@ const KeyboardAvoidingView = createReactClass({

/**
* This is the distance between the top of the user screen and the react native view,
* may be non-zero in some use cases.
* may be non-zero in some use cases. The default value is 0.
*/
keyboardVerticalOffset: PropTypes.number.isRequired,
},
Expand All @@ -81,7 +85,7 @@ const KeyboardAvoidingView = createReactClass({
subscriptions: ([]: Array<EmitterSubscription>),
frame: (null: ?ViewLayout),

relativeKeyboardHeight(keyboardFrame: ScreenRect): number {
_relativeKeyboardHeight(keyboardFrame: ScreenRect): number {
const frame = this.frame;
if (!frame || !keyboardFrame) {
return 0;
Expand All @@ -94,14 +98,14 @@ const KeyboardAvoidingView = createReactClass({
return Math.max(frame.y + frame.height - keyboardY, 0);
},

onKeyboardChange(event: ?KeyboardChangeEvent) {
_onKeyboardChange(event: ?KeyboardChangeEvent) {
if (!event) {
this.setState({bottom: 0});
return;
}

const {duration, easing, endCoordinates} = event;
const height = this.relativeKeyboardHeight(endCoordinates);
const height = this._relativeKeyboardHeight(endCoordinates);

if (duration && easing) {
LayoutAnimation.configureNext({
Expand All @@ -115,7 +119,7 @@ const KeyboardAvoidingView = createReactClass({
this.setState({bottom: height});
},

onLayout(event: ViewLayoutEvent) {
_onLayout(event: ViewLayoutEvent) {
this.frame = event.nativeEvent.layout;
},

Expand All @@ -132,12 +136,12 @@ const KeyboardAvoidingView = createReactClass({
componentWillMount() {
if (Platform.OS === 'ios') {
this.subscriptions = [
Keyboard.addListener('keyboardWillChangeFrame', this.onKeyboardChange),
Keyboard.addListener('keyboardWillChangeFrame', this._onKeyboardChange),
];
} else {
this.subscriptions = [
Keyboard.addListener('keyboardDidHide', this.onKeyboardChange),
Keyboard.addListener('keyboardDidShow', this.onKeyboardChange),
Keyboard.addListener('keyboardDidHide', this._onKeyboardChange),
Keyboard.addListener('keyboardDidShow', this._onKeyboardChange),
];
}
},
Expand All @@ -161,7 +165,7 @@ const KeyboardAvoidingView = createReactClass({
heightStyle = {height: this.frame.height - this.state.bottom, flex: 0};
}
return (
<View ref={viewRef} style={[style, heightStyle]} onLayout={this.onLayout} {...props}>
<View ref={viewRef} style={[style, heightStyle]} onLayout={this._onLayout} {...props}>
{children}
</View>
);
Expand All @@ -171,7 +175,7 @@ const KeyboardAvoidingView = createReactClass({
const { contentContainerStyle } = this.props;

return (
<View ref={viewRef} style={style} onLayout={this.onLayout} {...props}>
<View ref={viewRef} style={style} onLayout={this._onLayout} {...props}>
<View style={[contentContainerStyle, positionStyle]}>
{children}
</View>
Expand All @@ -181,14 +185,14 @@ const KeyboardAvoidingView = createReactClass({
case 'padding':
const paddingStyle = {paddingBottom: this.state.bottom};
return (
<View ref={viewRef} style={[style, paddingStyle]} onLayout={this.onLayout} {...props}>
<View ref={viewRef} style={[style, paddingStyle]} onLayout={this._onLayout} {...props}>
{children}
</View>
);

default:
return (
<View ref={viewRef} onLayout={this.onLayout} style={style} {...props}>
<View ref={viewRef} onLayout={this._onLayout} style={style} {...props}>
{children}
</View>
);
Expand Down