React Native — Добавление поля: 1 в Camera Roll

Как идеально добавить margin: 1 в фотопленку? Потому что, когда я добавлю margin: 1 в свой <Image .../>, порядок будет не в правильном порядке.

Результат, который я хочу, как в Instagram. Слева и справа нет полей, верно?

Так же, как это изображение:

React Native — Добавление поля: 1 в Camera Roll

Вот мои коды:

render() {
return(
  <View style = {styles.container}>
    {/* <SelectedImage source = {{uri: this.state.pickedImage}}/> */}
    <Image source = {{uri: this.state.pickedImage}} style = {styles.image}/>
    <ScrollView contentContainerStyle = {styles.scrollView} showsVerticalScrollIndicator = {false}>
      {this.state.photos.map((photos, index) => {
        return(
          <TouchableHighlight 
            style = {{opacity: index === this.state.index ? .5 : 1}}
            onPress = {() => this.setState({pickedImage: photos.node.image.uri})}
            key = {index}
            underlayColor='transparent'
          >
            <Image
              style = {{width: width / 3, height: width /3}}
              source = {{uri: photos.node.image.uri}}
              resizeMode='cover'
            />
          </TouchableHighlight>
        );
      })}
    </ScrollView>
  </View>
); 
}
}

const styles = StyleSheet.create({
container: {
 height: '100%',
 width: '100%',
 justifyContent: 'center',
 alignItems: 'center',
 backgroundColor: 'white'
},
scrollView: {
 flexWrap: 'wrap',
 flexDirection: 'row'
},
scrollViewContainer: {
 flex: 1,
 flexDirection: 'row',
},
 image: {
 width: '100%',
 height: 300,
 backgroundColor: 'black'
}
});

Это мой собственный результат: (Не беспокойтесь о черной рамке, я просто не обрезал идеально, и у меня всего 6 фотографий в моем эмуляторе Android).

React Native — Добавление поля: 1 в Camera Roll

Предлагаемый ответ:

componentDidMount() {
this.getPhotos();
this.rightButtonIcon();
requestExternalStoragePermission();

photoFilter = () => {
  var arr = this.state.photos;
  var number = 0;
  arr.forEach((item) => {
    switch(number) {
      case 0: 
        number = 1;
        item.position = "left"
      break;
      case 1:
        number = 2;
        item.position = "center"
      break;
      case 2: 
        number = 0;
        item.position = "right"
      break;
      default:
        return null;
    }
  })
  this.setState({photos: arr})
}
};

 imageStylePositionCalc = (pos) =>{
  if (pos== = "left") return {marginRight:1,marginBottom:1}
  if (pos== = "center") return {marginRight:1,marginBottom:1}
  if (pos== = "right") return {marginBottom:1}
 }

  render() {
return(
  <View style = {styles.container}>
    {/* <SelectedImage source = {{uri: this.state.pickedImage}}/> */}
    <Image source = {{uri: this.state.pickedImage}} style = {styles.image}/>
    <ScrollView contentContainerStyle = {styles.scrollView} showsVerticalScrollIndicator = {false}>
      {this.state.photos.map((photos, index) => {
        return(
          <TouchableHighlight 
            style = {{opacity: index === this.state.index ? .5 : 1}}
            onPress = {() => this.setState({pickedImage: photos.node.image.uri})}
            key = {index}
            underlayColor='transparent'
          >
            <Image
              style = {[{width: width / 3, height: width /3}, this.imageStylePositionCalc(photos.position)]}
              source = {{uri: photos.node.image.uri}}
              resizeMode='cover'
            />
          </TouchableHighlight>
        );
      })}
    </ScrollView>
  </View>
); 
}
}

Это еще одна проблема, поле: 1 занимает всю ширину экрана, а во 2-й строке нет поля:

React Native — Добавление поля: 1 в Camera Roll

Вы пытались добавить borderColor:"#fff" к изображению (или touchableOpacity)?

Auticcat 10.07.2019 15:13

Нет, я еще не пробовал.

Liza Catherine Ombyaw 10.07.2019 16:19

Как я уже упоминал, я не хочу, чтобы 1-й столбец имел поле слева, а 3-й столбец — справа.

Liza Catherine Ombyaw 10.07.2019 16:20

Как вы визуализируете свои изображения? есть 2 в строке или они могут иметь случайные размеры, как изображение, которое вы разместили?

Auticcat 10.07.2019 16:57

Как выглядит текущее изображение? Пожалуйста, покажите мне экран результатов.

hong developer 10.07.2019 17:10

@Auticcat нет, я использую «Размеры», чтобы получить ширину экрана, и разделил его на 3, чтобы получить 3 столбца.

Liza Catherine Ombyaw 11.07.2019 04:40

@hongdevelop уже добавил это!

Liza Catherine Ombyaw 11.07.2019 04:40
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
7
213
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

const styles = StyleSheet.create({
    container: {
        height: '100%',
        width: '100%',
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: 'white'
    },
    scrollView: {
        flexWrap: 'wrap',
        flexDirection: 'row',
        justifyContent: 'space-between', // This one is new
        marginHorizontal: -3 // This one is new
    },
    scrollViewContainer: {
        flex: 1,
        flexDirection: 'row'
    },
    image: {
        width: '100%',
        height: 300,
        backgroundColor: 'black'
    }
});

/* Rest of the code stays the same, only the image style gets changed to the follwoing */

<Image
    style = {{
        width: width / 3,
        height: width / 3,
        margin: 1
    }}
    source = {{ uri: photos.node.image.uri }}
    resizeMode = "cover"
/>

Надеюсь это поможет.

Не подходит к дизайну, который я хочу, ха-ха. В любом случае, спасибо за попытку.

Liza Catherine Ombyaw 11.07.2019 10:34
Ответ принят как подходящий

Прежде чем делать карту, я бы посоветовал пройтись по каждой части массива и добавить значение, указывающее, будет ли оно размещено справа, слева или в центре. Что-то типа:

photoFilter=()=>{
   var arr=this.state.photos;
   var number=0;
   arr.forEach((item)=>{
      switch (number){
         case 0: 
            number=1;
            item.position = "left"
            break;  
         case 1: 
            number=2;
            item.position = "center"
            break;  
         case 2: 
            number=0;
            item.position = "right"
            break; 
         default:
            return null 
      }
  })
this.setState({photos:arr})
}

затем при рендеринге изображения:

<Image
style = {[{width: width / 3, height: width /3},this.imageStylePositionCalc(item.position)]}
source = {{ uri: photos.node.image.uri }}
resizeMode = "cover"
/>

затем добавьте функцию:

imageStylePositionCalc=(pos)=>{
  if (pos== = "left") return {marginRight:1,marginBottom:1}
  if (pos== = "center") return {marginRight:1,marginBottom:1}
  if (pos== = "right") return {marginBottom:1}
}

Это может быть не лучший ответ, но должен работать

ОБНОВИТЬ: Проблема в том, что вы определяете функцию photoFilter внутри файла didMount.

Когда я сказал вызывать его внутри componentDidMount, я имел в виду:

componentDidMount() {
this.getPhotos();
this.rightButtonIcon();
requestExternalStoragePermission();
this.photoFilter
}

photoFilter = () => {
      var arr = this.state.photos;
      var number = 0;
      arr.forEach((item) => {
        switch(number) {
          case 0: 
            number = 1;
            item.position = "left"
          break;
          case 1:
            number = 2;
            item.position = "center"
          break;
          case 2: 
            number = 0;
            item.position = "right"
          break;
          default:
            return null;
        }
      })
      this.setState({photos: arr})
    }

Выдает ошибку «Не удается найти переменную: элемент», и где я должен передать функцию photoFilter()?

Liza Catherine Ombyaw 11.07.2019 10:44

Вы можете поместить его в свою функцию componentDidMount. Изменить элемент item на photos

Auticcat 11.07.2019 10:46

думаю ничего не будет?

Liza Catherine Ombyaw 11.07.2019 11:01

Вы имеете в виду arr.forEach(item) до arr.forEach(photos)?

Liza Catherine Ombyaw 11.07.2019 11:02

Я имею в виду тот, который находится внутри рендера <Image>, когда вы устанавливаете стиль при вызове imageStylePositionCalc().

Auticcat 11.07.2019 11:03

Можете ли вы обновить код с изменениями, которые я предложил?

Auticcat 11.07.2019 11:10

Хорошо, я добавлю к моему вопросу

Liza Catherine Ombyaw 11.07.2019 11:11

Сделанный. В разделе «Предложенный ответ»

Liza Catherine Ombyaw 11.07.2019 11:13

Забыл заставить его вызывать функцию, сделайте this.photoFilter()

Auticcat 11.07.2019 11:27

Стили хотя бы применяются? imageStylePositionCalc что-то возвращает? если попробовать добавить под if (pos== = "right") return {marginBottom:1} еще один возврат без условий? поставить return {marginLeft:1} просто посмотреть, изменится ли что-то? может состояние не обновляется

Auticcat 11.07.2019 11:33

Это действительно не работает. Я имею в виду, что стили не применяются

Liza Catherine Ombyaw 11.07.2019 11:35

Давайте продолжить обсуждение в чате.

Auticcat 11.07.2019 11:36

Другие вопросы по теме