Skip to content

Instantly share code, notes, and snippets.

@larkintuckerllc
Created September 30, 2018 19:18
Show Gist options
  • Save larkintuckerllc/15644c314207df00c212ecb14b981439 to your computer and use it in GitHub Desktop.
Save larkintuckerllc/15644c314207df00c212ecb14b981439 to your computer and use it in GitHub Desktop.
hrnk 4
import { PropTypes } from 'prop-types';
import React, { Component } from 'react';
import { Animated, Dimensions, Keyboard, StyleSheet, TextInput, UIManager } from 'react-native';
const { State: TextInputState } = TextInput;
export default class KeyboardShift extends Component {
state = {
shift: new Animated.Value(0),
};
componentWillMount() {
this.keyboardDidShowSub = Keyboard.addListener('keyboardDidShow', this.handleKeyboardDidShow);
this.keyboardDidHideSub = Keyboard.addListener('keyboardDidHide', this.handleKeyboardDidHide);
}
componentWillUnmount() {
this.keyboardDidShowSub.remove();
this.keyboardDidHideSub.remove();
}
render() {
const { children: renderProp } = this.props;
const { shift } = this.state;
return (
<Animated.View style={[styles.container, { transform: [{translateY: shift}] }]}>
{renderProp()}
</Animated.View>
);
}
handleKeyboardDidShow = (event) => {
const { height: windowHeight } = Dimensions.get('window');
const keyboardHeight = event.endCoordinates.height;
const currentlyFocusedField = TextInputState.currentlyFocusedField();
UIManager.measure(currentlyFocusedField, (originX, originY, width, height, pageX, pageY) => {
const fieldHeight = height;
const fieldTop = pageY;
const gap = (windowHeight - keyboardHeight) - (fieldTop + fieldHeight);
if (gap >= 0) {
return;
}
Animated.timing(
this.state.shift,
{
toValue: gap,
duration: 1000,
useNativeDriver: true,
}
).start();
});
}
handleKeyboardDidHide = () => {
Animated.timing(
this.state.shift,
{
toValue: 0,
duration: 1000,
useNativeDriver: true,
}
).start();
}
}
const styles = StyleSheet.create({
container: {
height: '100%',
left: 0,
position: 'absolute',
top: 0,
width: '100%'
}
});
KeyboardShift.propTypes = {
children: PropTypes.func.isRequired,
};
@jforaker
Copy link

@wilbertaristo you can replace it by grabbing the native id from the currentlyFocusedInput object:

  // replace currentlyFocusedField with this:
  const { _nativeTag } = TextInputState.currentlyFocusedInput();

@wilbertaristo
Copy link

@jforaker that works! thank you so much :) btw to prevent TypeScript from giving me errors I modified the above into:

const { _nativeTag } = (TextInputState as any).currentlyFocusedInput();

@Biplovkumar
Copy link

@wilbertaristo can u please post here updated typescript class

@Biplovkumar
Copy link

cause of UIManager.measure also depricated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment