我有一个窗体 Package 在父容器(它是一个KeyboardAvoidingView)中,在添加适当的flex属性以水平和垂直居中窗体之后,窗体在两个方向上都不居中。
下面是包含表单的父容器的代码:
const AuthScreen = () => {
const [isSignup, setIsSignup] = useState(false)
return (
<SafeAreaView style={{flex: 1}}>
<PageContainer>
<ScrollView>
<KeyboardAvoidingView style={styles.keyboardAvoidingView} behavior={Platform.OS === "ios" ? "height" : undefined} keyboardVerticalOffset={100}>
<LoginForm />
</KeyboardAvoidingView>
</ScrollView>
</PageContainer>
</SafeAreaView>
)
}
const styles = StyleSheet.create({
keyboardAvoidingView: {
padding: 10,
alignItems: 'center',
justifyContent: 'center',
flex: 1,
}
})
export default AuthScreen
字符串
下面是表单(LoginForm)代码。这是我希望居中的表单:
const LoginForm = () => {
const [formState, dispatchFormState] = useReducer(reducer, initialState);
const inputChangedHandler = useCallback((id, value) => {
// Validate current input status
const validationResult = validateInput(id, value)
dispatchFormState({id, value, validationResult})
}, [dispatchFormState])
return (
<>
<Input errorText={formState.inputValidities["email"]} inputChanged={inputChangedHandler} id="email" placeholder="Email Address" />
<Input errorText={formState.inputValidities["password"]} inputChanged={inputChangedHandler} id="password" placeholder="Password" />
<SubmitButton title='Login' />
</>
)
}
const styles = StyleSheet.create({
})
export default LoginForm
型
Input组件代码:
const Input = props => {
const {id, placeholder, inputChanged, errorText} = props
return <View style={styles.container}>
<View style={styles.inputContainer}>
<TextInput onChangeText={(text) => inputChanged(id, text)} placeholderTextColor="white" style={styles.input} placeholder={placeholder} />
</View>
{
errorText &&
<View style={styles.errorContainer}>
<Text style={{color: 'red'}}>{errorText[0]}</Text>
</View>
}
</View>
}
const styles = StyleSheet.create({
container: {
width: '100%',
marginTop: 32,
alignItems: 'center',
},
input: {
backgroundColor: colors.inputBgColor,
flex: 1,
paddingVertical: 6,
paddingHorizontal: 12,
letterSpacing: 0.3,
color: 'white'
},
inputContainer: {
width: '100%',
flexDirection: 'row',
alignItems: 'center',
},
errorContainer: {
alignItems: 'center',
marginTop: 10
}
})
export default Input
型
我能知道为什么这个表格没有居中吗?- 谢谢你-谢谢
2条答案
按热度按时间6ie5vjzr1#
使用contentContainerStyle将样式应用于滚动视图内容容器。使用
flexGrow: 1
可以让孩子在需要的时候成长。字符串
kulphzqa2#
代码的问题可能与在父容器上组合使用
KeyboardAvoidingView
和flex
属性有关。使用KeyboardAvoidingView
并尝试使用flex
将其内容居中时,可能会遇到意外行为。以下是解决此问题的建议:
1.从
AuthScreen
中的keyboardAvoidingView
样式中删除flex: 1
。这将防止KeyboardAvoidingView
占用所有可用空间。1.不要在
keyboardAvoidingView
上使用alignItems: 'center'
和justifyContent: 'center'
,而是将这些属性应用于ScrollView
和PageContainer
组件。这将使KeyboardAvoidingView
位于ScrollView
的中心,PageContainer
位于SafeAreaView
的中心。以下是
AuthScreen
的更新代码:字符串
请注意,我添加了两个新样式:
pageContainer
和scrollViewContent
,分别处理SafeAreaView
和ScrollView
内内容的居中。通过此更改,您的
LoginForm
组件现在应该在水平和垂直方向上居中。