react-native-keyboard-aware-scroll-view
react-native-keyboard-aware-scroll-view copied to clipboard
[iOS] Unwated scrolling to top when change focus between two horizontal inputs
Problem
Hello. I have a mysterious behavior with iOS when try to change focus between inputs by touch.
Numeric keyboard has no 'next' button, also two inputs are inside horizontal layout.
NumberInput
it's just a forwardRef
wrapper for Input
in react-native-elements
. Also tried with TextInput from react native.
Android works very well!

Play video with problem on imgur.com
Tries
- played with all props combinations like
keyboardShouldPersistTaps
andkeyboardDismissMode
,enableAutomaticScroll
and etc... - tried to disable automatic scroll and use it only in
onFocus
prop in TextInputs - ref from
innerRef
don't do anything (because scroll height doesn't changed) - tried change
innerRef
toref
. nothing changes.
??
- Also on iOS it has 'delay' between focus and scroll to input...
- It doesn't scroll automatically when I write text by hardware or iOS keyboards..
Source:
import React, { PureComponent } from 'react';
import { Platform } from 'react-native';
import { StyleSheet } from 'react-native';
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
import { CardHorizontalContent, CardElement } from '@js/components/Card';
import { Button } from '@app/theme/components';
import { Typography } from '@app/theme/components/Typography';
import { LayoutHorizontalItems } from '@app/theme/components/Layout';
import { NumberInput } from '@app/theme/components/TextInput';
import { RulesViewDescription, RulesViewFooter } from '@app/apps/Rules/components';
const styles = StyleSheet.create({
root: {
flexGrow: 1,
paddingTop: 16,
paddingHorizontal: 24,
},
inputsContainer: {
paddingHorizontal: 0,
marginHorizontal: -4,
},
offset: {
marginBottom: 16,
}
});
export class SetVoltageRuleStep extends PureComponent<never> {
renderTextInputs() {
return (
<LayoutHorizontalItems gutter={4} style={styles.inputsContainer}>
<NumberInput
metricName="V"
placeholder="Min Voltage"
style={{ height: 56 }}
/>
<NumberInput
metricName="V"
placeholder="Max Voltage"
style={{ height: 56 }}
/>
</LayoutHorizontalItems>
)
}
renderDescription() {
const changeOf = 'Process Long Title Name';
const changeTo = 'Other Device First';
return (
<RulesViewDescription>
Defines battery voltage which will trigger the change of
<Typography variant="subheading"> {changeOf} </Typography>
to <Typography variant="subheading">{changeTo}</Typography>.
</RulesViewDescription>
);
}
render() {
const extraScrollHeight = Platform.OS === 'ios' ? 48 : 0;
return (
<>
<KeyboardAwareScrollView
style={styles.root}
extraScrollHeight={extraScrollHeight}
showsVerticalScrollIndicator={false}
bounces={false}
overScrollMode="never"
enableOnAndroid
// I've tryed all of values...
keyboardShouldPersistTaps="handled"
>
{this.renderDescription()}
<CardElement>
<CardHorizontalContent
title="Simple"
subTitle={(
<Typography variant="subheading" gray>...</Typography>
)}
/>
</CardElement>
{this.renderTextInputs()}
</KeyboardAwareScrollView >
<RulesViewFooter>
<Button title="Skip" type="filled" />
<Button title="Next" type="filledColor" />
</RulesViewFooter>
</>
);
}
}
??
iOS 10.3.1
react-native "0.61.5"
react-native-keyboard-aware-scroll-view "0.9.1"
also iOS 13.3 the same
Same here, please fix this.
Same here, please fix this.
Try enableResetScrollToCoords={false}
?
I have a similar issue like this, @icony36 solution did not work for me, see the gif, it was recorded with the prop enableResetScrollToCoords
set to false
any ideas? I'm out of them :(
ps. sorry about the low fps gif, i used something online to convert my mov..
@lucasreppewelander same issue, any update ??
@lucasreppewelander @minh-dai Similar issue here. Any update, guys?
https://github.com/APSL/react-native-keyboard-aware-scroll-view/issues/418#issuecomment-617474009
I managed to solve it by setting keyboardOpeningTime={Number.MAX_SAFE_INTEGER}, but it's just a workaround.
I think these issues are related based on my personal issue, and this patched worked for my needs.
@AlanLeePhilly Pfff, one thousands thanks for the reference.
I have similar issue like @lucasreppewelander, solution @icony36 didn't work for me, solution @AlanLeePhilly didn't work for me as well.
Any ideas? I tried everything.. :/
In my case,
I noticed that there is a Keyboard listener to set height for iOS in KeyboardAwareHOC.js
So I just add another listener in my Screen to get the Keyboard height and add it to
extraScrollHeight
The code is like below:
class ExampleScreen extends Component {
constructor(props: any) {
super(props);
this.state = {
keyboardHeight: 0,
}
this.keyboardDidShowListener = Keyboard.addListener('keyboardDidShow', this._keyboardDidShow);
this.keyboardDidHideListener = Keyboard.addListener('keyboardDidHide', this._keyboardDidHide);
}
componentWillUnmount () {
this.keyboardDidShowListener.remove();
this.keyboardDidHideListener.remove();
}
_keyboardDidShow () {
this.setState({
keyboardHeight: e.endCoordinates.height
})
}
_keyboardDidHide () {
this.setState({
keyboardHeight: 0
})
}
renderContent() {
....
}
render() {
return (
KeyboardAwareScrollView
contentContainerStyle={{ flexGrow: 1, }}
showsVerticalScrollIndicator={true}
indicatorStyle={'white'}
enableOnAndroid={true}
enableAutomaticScroll={true}
keyboardShouldPersistTaps='handled'
extraScrollHeight={ isIOS? this.state.keyboardHeight: 0}
>
{this.renderContent()}
</KeyboardAwareScrollView>
);
}
}
Above solutions didnt work me. What worked was extraHeight
prop.
extraHeight={150}
I had to play around with value to make it work. For instance, 100 didn't work but 150 did.
Above solutions didnt work me. What worked was
extraHeight
prop.extraHeight={150}
I had to play around with value to make it work. For instance, 100 didn't work but 150 did.
extraHeight={150} not work but extraHeight={0} works for me
keyboardOpeningTime={Number.MAX_SAFE_INTEGER}
This fixed it for me :')
keyboardOpeningTime={Number.MAX_SAFE_INTEGER}
This fixed it for me :')
It's working well to me👍
same issue here
keyboardOpeningTime={Number.MAX_SAFE_INTEGER}
This works fine