Как идеально добавить margin: 1 в фотопленку? Потому что, когда я добавлю margin: 1 в свой <Image .../>, порядок будет не в правильном порядке.
Результат, который я хочу, как в Instagram. Слева и справа нет полей, верно?
Так же, как это изображение:
Вот мои коды:
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).
Предлагаемый ответ:
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-й строке нет поля:
Нет, я еще не пробовал.
Как я уже упоминал, я не хочу, чтобы 1-й столбец имел поле слева, а 3-й столбец — справа.
Как вы визуализируете свои изображения? есть 2 в строке или они могут иметь случайные размеры, как изображение, которое вы разместили?
Как выглядит текущее изображение? Пожалуйста, покажите мне экран результатов.
@Auticcat нет, я использую «Размеры», чтобы получить ширину экрана, и разделил его на 3, чтобы получить 3 столбца.
@hongdevelop уже добавил это!





У меня есть решение для вашей проблемы, которое может быть не самым лучшим, потому что я не уверен, как избавиться от верхнего и нижнего поля, но что угодно.
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"
/>
Надеюсь это поможет.
Не подходит к дизайну, который я хочу, ха-ха. В любом случае, спасибо за попытку.
Прежде чем делать карту, я бы посоветовал пройтись по каждой части массива и добавить значение, указывающее, будет ли оно размещено справа, слева или в центре. Что-то типа:
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()?
Вы можете поместить его в свою функцию componentDidMount. Изменить элемент item на photos
думаю ничего не будет?
Вы имеете в виду arr.forEach(item) до arr.forEach(photos)?
Я имею в виду тот, который находится внутри рендера <Image>, когда вы устанавливаете стиль при вызове imageStylePositionCalc().
Можете ли вы обновить код с изменениями, которые я предложил?
Хорошо, я добавлю к моему вопросу
Сделанный. В разделе «Предложенный ответ»
Забыл заставить его вызывать функцию, сделайте this.photoFilter()
Стили хотя бы применяются? imageStylePositionCalc что-то возвращает? если попробовать добавить под if (pos== = "right") return {marginBottom:1} еще один возврат без условий? поставить return {marginLeft:1} просто посмотреть, изменится ли что-то? может состояние не обновляется
Это действительно не работает. Я имею в виду, что стили не применяются
Давайте продолжить обсуждение в чате.
Вы пытались добавить
borderColor:"#fff"к изображению (илиtouchableOpacity)?