【问题标题】:In React Native, How Can I Use KeyboardAvoidingView with a Modal in iOS?在 React Native 中,如何在 iOS 中将 KeyboardAvoidingView 与 Modal 一起使用?
【发布时间】:2020-11-23 02:01:41
【问题描述】:

我无法让 KeyboardAvoidingView 在 iOS 中工作,特别是在其中包装 Modal 时。在 Android 中测试,Modal 正确地避开了键盘,但在 iOS 中,键盘覆盖了 Modal。

这是一个可重现的示例,使用 iPhone X 作为我的测试设备:

import React, {useState} from 'react';
import {StyleSheet, ScrollView, View, Modal, TextInput, KeyboardAvoidingView, Button, SafeAreaView} from 'react-native';

export default function App() {
    const [modalVisible, setModalVisible] = useState(false);

    return (
        <View style={styles.container}>
            <Button title={"Open Modal"} onPress={() => setModalVisible(true)}/>
            {modalVisible && 
            <KeyboardAvoidingView behavior={Platform.OS === "ios" ? "padding" : "height"}>
                <Modal
                    animationType="slide"
                    transparent={true}
                    visible={modalVisible}>
                    <SafeAreaView style={styles.safeAreaView}>
                        <View style={styles.modalContentContainer}>
                            <Button title={"Close Modal"} onPress={() => setModalVisible(false)}/>
                            <ScrollView>
                                <View style={styles.textInputContainer}>
                                    <TextInput
                                        value={"test 1"}
                                        onChangeText={() => {}}
                                        onBlur={() => {}}
                                    />
                                </View>
                                <View style={styles.textInputContainer}>
                                    <TextInput
                                        value={"test 2"}
                                        onChangeText={() => {}}
                                        onBlur={() => {}}
                                    />
                                </View>
                                <View style={styles.textInputContainer}>
                                    <TextInput
                                        value={"test 3"}
                                        onChangeText={() => {}}
                                        onBlur={() => {}}
                                    />
                                </View>
                                <View style={styles.textInputContainer}>
                                    <TextInput
                                        value={"test 4"}
                                        onChangeText={() => {}}
                                        onBlur={() => {}}
                                    />
                                </View>
                            </ScrollView>
                        </View>
                    </SafeAreaView>
                </Modal>
            </KeyboardAvoidingView>}
        </View>
    );
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#fff',
        alignItems: 'center',
        paddingTop: 50
    },
    safeAreaView: {
        flex: 1,
        justifyContent: "center",
        alignItems: "center",
    },
    modalContentContainer: {
        margin: 100,
        backgroundColor: "#d6d6d6",
        width: "80%",
        height: "60%",
        borderRadius: 10,
    },
    textInputContainer: {
        flex: 1,
        margin: 40,
        alignItems: "center",
    }
});

您会注意到,当您打开 Modal 并点击最后一个 TextInput 字段时,键盘会出现并覆盖 Modal。正如预期的那样,Modal 不会避开键盘。

这是我在 iOS 中测试的屏幕截图,但它不起作用:

这是我在 Android 中测试的屏幕截图,它正在运行:

关于如何在 iOS 中让 Modal 避免键盘的任何想法?

【问题讨论】:

    标签: javascript android ios reactjs react-native


    【解决方案1】:

    您正在使用 KeyboardAvoidingView 包装您的 Modal。我不确定这一点,但从我的测试来看,使用 KeyboardAvoidingView 调整模态似乎是不可能的。

    因此,将 KeyboardAvoidingView 移动到 Modal 内以获得预期的行为。 像这样:

    return (
            <View style={styles.container}>
                <Button title={"Open Modal"} onPress={() => setModalVisible(true)}/>
                {modalVisible && 
                    <Modal
                        animationType="slide"
                        transparent={true}
                        visible={modalVisible}>
                          <KeyboardAvoidingView behavior={"padding"} style={styles.safeAreaView}>
                            <View style={styles.modalContentContainer}>
                                <Button title={"Close Modal"} onPress={() => setModalVisible(false)}/>
                                <ScrollView>
                                    <View style={styles.textInputContainer}>
                                        <TextInput
                                            value={"test 1"}
                                            onChangeText={() => {}}
                                            onBlur={() => {}}
                                        />
                                    </View>
                                    <View style={styles.textInputContainer}>
                                        <TextInput
                                            value={"test 2"}
                                            onChangeText={() => {}}
                                            onBlur={() => {}}
                                        />
                                    </View>
                                    <View style={styles.textInputContainer}>
                                        <TextInput
                                            value={"test 3"}
                                            onChangeText={() => {}}
                                            onBlur={() => {}}
                                        />
                                    </View>
                                    <View style={styles.textInputContainer}>
                                        <TextInput
                                            value={"test 4"}
                                            onChangeText={() => {}}
                                            onBlur={() => {}}
                                        />
                                    </View>
                                </ScrollView>
                            </View>
                        </KeyboardAvoidingView>
                    </Modal>}
            </View>
        );
    

    我还删除了您的 SafeAreaView,因为它目前没有任何作用。您的父母已经居中,其内容永远不会到达设备的“不安全”区域。

    您不妨从代码中删除{modalVisible &amp;&amp; ...},因为visible={modalVisible} 已经隐藏并在需要时显示模式。

    演示: https://imgur.com/W7sEPpn

    【讨论】:

    • 那行得通,我不敢相信我没有尝试过。感谢您的帮助以及其他建议。
    • 通常程序员说“你拯救了我的一天”,但在我的情况下,你拯救了我的夜晚;D
    【解决方案2】:

    如果您使用 react-native-modal 包 ...avoidKeyboard 属性可以解决问题...

    import Modal from "react-native-modal";
    
    return (
        <Modal
            avoidKeyboard
            /** rest props */
        >
            {/* Content goes here */}
        </Modal>
    );
    

    不在build-in-react-native-modal ...它在react-native-modal here

    【讨论】:

    猜你喜欢
    • 2022-06-15
    • 2019-10-13
    • 2018-08-02
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多