Ваше первое решение кажется мне достаточно хорошим, возможно, небольшие модификации дадут вам результат, который вы ищете, следуйте инструкциям:
- Сначала давайте свяжем все соответствующие реквизиты для
<View />
стайлинга сзначения состояний
// ... all your imports and other code
state ={
viewHeight: 0, // or any default value you want
viewWidth: 0, // or any default value you want
// ... other view parameters used and other state values
}
// ... functions and other code
render() {
return (
// ... other rendered components etc
<View
style={{
width: this.state.viewWidth,
height: this.state.viewHeight
}} />
)
}
- Далее мы будем получать уровень масштабирования карты каждый раз, когда он меняется, и предварительно выполнять какие-то условия
<MapView
ref='map' // <==== add the ref map so we can access the zoom level from our _onMapChange function later
style={{ flex: 1 }}
provider={PROVIDER_GOOGLE} // <==== this approach will not work on apple maps as the camera will not give us the zoom parameter so use google maps
onRegionChange={() => this._onMapChange()} /> // <==== this will tell the map to fire the _onMapChange() function everytime there is a change to the map region
Функция
_onMapChange()
:
_onMapChange = async () => {
const {
zoom,
pitch,
center,
heading
} = await this.refs.map.getCamera();
// Now set the conditions for the view style based on the zoom level, maybe something like this:
if (zoom <= 5) {
this.setState({
viewWidth: 50, // what ever width you want to set
viewHeight: 50 // what ever height you want to set
// ... other view parameters
})
} else if (zoom <= 10) {
this.setState({
viewWidth: 100, // what ever width you want to set
viewHeight: 100 // what ever height you want to set
// ... other view parameters
})
}
}
Heads-Up: я использую свой редактор, вот и все, поэтому могут быть некоторые синтаксические ошибки
Надеюсь, это поможет!