Как расположить кнопку в правом нижнем углу MapView в React Native?

#react-native

#react-native

Вопрос:

Я пытаюсь разобраться с flexbox, а также с тем, как дерево компонентов работает с react-native-maps MapView (и отличается ли это от других компонентов с компонентами «поверх них», для которых я сейчас использую Callout .

Например, вот мой MapView метод рендеринга. TouchableOpacity Область (и ее buttonCallout контейнер. в настоящее время предназначен только для моих экспериментов в понимании макета. Я использую F8StyleSheet оболочку из makeitopen.com

 
  render() {
    return (
      <View style={styles.container}>
        <MapView
          style={{ flex: 1 }}
          region={this.state.region}
          showsUserLocation={true}
        >
          {this.renderMarkers()}
        </MapView>
        <Callout style={styles.searchCallout}>
          <TextInput
            onChangeText={searchText => this.setState({ searchText })}
            onSubmitEditing={this.handleSearch.bind(this)}
            style={styles.calloutSearch}
            placeholder={"Search"}
            value={this.state.searchText}
          />
        </Callout>
        <Callout style={styles.buttonCallout}>
          <TouchableOpacity
            style={[styles.touchable]}
            onPress={() => console.log("press")}
          >
            <Text style={styles.touchableText}>Press Me 1</Text>
          </TouchableOpacity>
          <TouchableOpacity
            style={[styles.touchable]}
            onPress={() => console.log("press")}
          >
            <Text style={styles.touchableText}>Press Me 2</Text>
          </TouchableOpacity>
        </Callout>
      </View>
    );
  }
}

const styles = F8StyleSheet.create({
  container: {
    flex: 1
  },
  buttonCallout: {
    flex: 1,
    alignSelf: "flex-end",
    justifyContent: "space-between",
    backgroundColor: "transparent",
    borderWidth: 0.5,
    ios: { padding: 5 },
    borderRadius: 20
  },
  touchable: {
    backgroundColor: "lightblue",
    padding: 10,
    margin: 10
  },
  touchableText: {
    fontSize: 24
  },
  searchCallout: {
    flexDirection: "row",
    backgroundColor: "rgba(255, 255, 255, 0.9)",
    borderRadius: 10,
    width: "80%",
    marginLeft: "5%",
    marginTop: 40
  },
  calloutSearch: {
    borderColor: "transparent",
    marginLeft: 10,
    width: "90%",
    marginRight: 10,
    height: 40,
    borderWidth: 0.0
  }
});
  

Имеет смысл, как я использую поля, чтобы searchCallout расположить там, где я хочу, потому что она находится вверху.

В нынешнем виде код buttonCallout TouchableOpacity внутренней частью) отображается в правом верхнем углу (разумно — alignSelf: 'flex-end' помещает его в «конец» справа).

Обновление в середине публикации! Изменив styles.container ‘s flexDirection на row , с выноской кнопок на alignSelf: flex-end . У меня есть выноска кнопки внизу, а выноска поиска все еще находится сверху. Я предполагаю, что Callout все компоненты отображаются друг над другом.

Итак, теперь я могу использовать justifyContent on styles.container , чтобы иметь обе выноски либо в центре, либо слева или справа ( center, flex-start, flex-end ). Как мне обосновать разные элементы по отдельности? ( justifySelf это не вещь!)

Перенос обеих выносок в не оформленный View компонент приводит к отображению выноски кнопки в правом верхнем углу, но выноски поиска нигде не найдено.

Перенос их обеих в выноску приводит к тому, что кнопки отображаются немного правее верхнего левого угла, при этом выноска поиска снова не отображается.

Помогите мне разобраться во всем этом! Спасибо 🙂

Ответ №1:

если вы пытаетесь расположить кнопку buttonCallout внизу, укажите ей postion:'absolute' , чтобы она оставалась внизу

 buttonCallout: {
    flex: 1,
    flexDirection:'row',
    position:'absolute',
    bottom:10,
    alignSelf: "center",
    justifyContent: "space-between",
    backgroundColor: "transparent",
    borderWidth: 0.5,
    borderRadius: 20
  },