用例:使用 react-native MapView 组件在地图上显示注释。设置初始地图区域,以便所有注释都可见。注释正在四处移动,这会触发重新渲染。此外,用户应该能够平移/缩放地图,因此onRegionChange()
并onRegionChangeComplete()
尝试捕捉区域变化并将其设置为状态;这样,无论何时发生重新渲染,地图区域都不会重置为初始地图区域。
render: function() {
...
return (
<MapView
region={this.state.region}
annotations={annotations}
onRegionChange={this.onRegionChange}
onRegionChangeComplete={this.onRegionChangeComplete}
/>
);
},
onRegionChange: function(region) {
this.setState({ region });
},
onRegionChangeComplete: function(region) {
this.setState({ region });
},
问题:由于更新状态的延迟,在状态中设置更新的区域不允许在地图上进行平滑的平移/滚动体验。经过几次平移或缩放后,地图会冻结,可能是因为它使用的是保存在该州中的当前区域,而不是更新后的区域。等待 1-2 秒,地图可以再次平移/缩放,大概是因为该地区现在已经更新了状态。
问题:有没有办法只设置 MapView 的初始区域,这样重新渲染不会导致区域重置?这样,onRegionChange()
并且onRegionChangeComplete()
可以用作代理方法来在新区域上执行工作(类似于 MKMapViewDelegate 的 mapView:regionWillChangeAnimated:),而不是保存区域本身以用于地图渲染。