-
Notifications
You must be signed in to change notification settings - Fork 24.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
78ec0df
commit fa87d83
Showing
9 changed files
with
655 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,196 @@ | ||
/** | ||
* Copyright 2004-present Facebook. All Rights Reserved. | ||
* | ||
* @providesModule MapViewExample | ||
*/ | ||
'use strict'; | ||
|
||
var React = require('react-native'); | ||
var StyleSheet = require('StyleSheet'); | ||
var { | ||
MapView, | ||
Text, | ||
TextInput, | ||
View, | ||
} = React; | ||
|
||
var MapRegionInput = React.createClass({ | ||
|
||
propTypes: { | ||
region: React.PropTypes.shape({ | ||
latitude: React.PropTypes.number, | ||
longitude: React.PropTypes.number, | ||
latitudeDelta: React.PropTypes.number, | ||
longitudeDelta: React.PropTypes.number, | ||
}), | ||
onChange: React.PropTypes.func.isRequired, | ||
}, | ||
|
||
getInitialState: function() { | ||
return { | ||
latitude: 0, | ||
longitude: 0, | ||
latitudeDelta: 0, | ||
longitudeDelta: 0, | ||
}; | ||
}, | ||
|
||
componentWillReceiveProps: function(nextProps) { | ||
this.setState(nextProps.region); | ||
}, | ||
|
||
render: function() { | ||
var region = this.state; | ||
return ( | ||
<View> | ||
<View style={styles.row}> | ||
<Text> | ||
{'Latitude'} | ||
</Text> | ||
<TextInput | ||
value={'' + region.latitude} | ||
style={styles.textInput} | ||
onChange={this._onChangeLatitude} | ||
/> | ||
</View> | ||
<View style={styles.row}> | ||
<Text> | ||
{'Longitude'} | ||
</Text> | ||
<TextInput | ||
value={'' + region.longitude} | ||
style={styles.textInput} | ||
onChange={this._onChangeLongitude} | ||
/> | ||
</View> | ||
<View style={styles.row}> | ||
<Text> | ||
{'Latitude delta'} | ||
</Text> | ||
<TextInput | ||
value={'' + region.latitudeDelta} | ||
style={styles.textInput} | ||
onChange={this._onChangeLatitudeDelta} | ||
/> | ||
</View> | ||
<View style={styles.row}> | ||
<Text> | ||
{'Longitude delta'} | ||
</Text> | ||
<TextInput | ||
value={'' + region.longitudeDelta} | ||
style={styles.textInput} | ||
onChange={this._onChangeLongitudeDelta} | ||
/> | ||
</View> | ||
<View style={styles.changeButton}> | ||
<Text onPress={this._change}> | ||
{'Change'} | ||
</Text> | ||
</View> | ||
</View> | ||
); | ||
}, | ||
|
||
_onChangeLatitude: function(e) { | ||
this.setState({latitude: parseFloat(e.nativeEvent.text)}); | ||
}, | ||
|
||
_onChangeLongitude: function(e) { | ||
this.setState({longitude: parseFloat(e.nativeEvent.text)}); | ||
}, | ||
|
||
_onChangeLatitudeDelta: function(e) { | ||
this.setState({latitudeDelta: parseFloat(e.nativeEvent.text)}); | ||
}, | ||
|
||
_onChangeLongitudeDelta: function(e) { | ||
this.setState({longitudeDelta: parseFloat(e.nativeEvent.text)}); | ||
}, | ||
|
||
_change: function() { | ||
this.props.onChange(this.state); | ||
}, | ||
|
||
}); | ||
|
||
var MapViewExample = React.createClass({ | ||
|
||
getInitialState() { | ||
return { | ||
mapRegion: null, | ||
mapRegionInput: null, | ||
}; | ||
}, | ||
|
||
render() { | ||
return ( | ||
<View> | ||
<MapView | ||
style={styles.map} | ||
onRegionChange={this._onRegionChanged} | ||
region={this.state.mapRegion} | ||
/> | ||
<MapRegionInput | ||
onChange={this._onRegionInputChanged} | ||
region={this.state.mapRegionInput} | ||
/> | ||
</View> | ||
); | ||
}, | ||
|
||
_onRegionChanged(region) { | ||
this.setState({mapRegionInput: region}); | ||
}, | ||
|
||
_onRegionInputChanged(region) { | ||
this.setState({ | ||
mapRegion: region, | ||
mapRegionInput: region, | ||
}); | ||
}, | ||
|
||
}); | ||
|
||
var styles = StyleSheet.create({ | ||
map: { | ||
height: 150, | ||
margin: 10, | ||
borderWidth: 1, | ||
borderColor: '#000000', | ||
}, | ||
row: { | ||
flexDirection: 'row', | ||
justifyContent: 'space-between', | ||
}, | ||
textInput: { | ||
width: 150, | ||
height: 20, | ||
borderWidth: 0.5, | ||
borderColor: '#aaaaaa', | ||
fontSize: 13, | ||
padding: 4, | ||
}, | ||
changeButton: { | ||
alignSelf: 'center', | ||
marginTop: 5, | ||
padding: 3, | ||
borderWidth: 0.5, | ||
borderColor: '#777777', | ||
}, | ||
}); | ||
|
||
exports.title = '<MapView>'; | ||
exports.description = 'Base component to display maps'; | ||
exports.examples = [ | ||
{ | ||
title: 'Map', | ||
render() { return <MapViewExample />; } | ||
}, | ||
{ | ||
title: 'Map shows user location', | ||
render() { | ||
return <MapView style={styles.map} showsUserLocation={true} />; | ||
} | ||
} | ||
]; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
/** | ||
* Copyright 2004-present Facebook. All Rights Reserved. | ||
* | ||
* @providesModule MapView | ||
*/ | ||
'use strict'; | ||
|
||
var EdgeInsetsPropType = require('EdgeInsetsPropType'); | ||
var NativeMethodsMixin = require('NativeMethodsMixin'); | ||
var React = require('React'); | ||
var ReactIOSViewAttributes = require('ReactIOSViewAttributes'); | ||
var View = require('View'); | ||
|
||
var createReactIOSNativeComponentClass = require('createReactIOSNativeComponentClass'); | ||
var deepDiffer = require('deepDiffer'); | ||
var insetsDiffer = require('insetsDiffer'); | ||
var merge = require('merge'); | ||
|
||
var MapView = React.createClass({ | ||
mixins: [NativeMethodsMixin], | ||
|
||
propTypes: { | ||
/** | ||
* Used to style and layout the `MapView`. See `StyleSheet.js` and | ||
* `ViewStylePropTypes.js` for more info. | ||
*/ | ||
style: View.propTypes.style, | ||
|
||
/** | ||
* If `true` the app will ask for the user's location and focus on it. | ||
* Default value is `false`. | ||
* | ||
* **NOTE**: You need to add NSLocationWhenInUseUsageDescription key in | ||
* Info.plist to enable geolocation, otherwise it is going | ||
* to *fail silently*! | ||
*/ | ||
showsUserLocation: React.PropTypes.bool, | ||
|
||
/** | ||
* If `false` the user won't be able to pinch/zoom the map. | ||
* Default `value` is true. | ||
*/ | ||
zoomEnabled: React.PropTypes.bool, | ||
|
||
/** | ||
* When this property is set to `true` and a valid camera is associated with | ||
* the map, the camera’s heading angle is used to rotate the plane of the | ||
* map around its center point. When this property is set to `false`, the | ||
* camera’s heading angle is ignored and the map is always oriented so | ||
* that true north is situated at the top of the map view | ||
*/ | ||
rotateEnabled: React.PropTypes.bool, | ||
|
||
/** | ||
* When this property is set to `true` and a valid camera is associated | ||
* with the map, the camera’s pitch angle is used to tilt the plane | ||
* of the map. When this property is set to `false`, the camera’s pitch | ||
* angle is ignored and the map is always displayed as if the user | ||
* is looking straight down onto it. | ||
*/ | ||
pitchEnabled: React.PropTypes.bool, | ||
|
||
/** | ||
* If `false` the user won't be able to change the map region being displayed. | ||
* Default value is `true`. | ||
*/ | ||
scrollEnabled: React.PropTypes.bool, | ||
|
||
/** | ||
* The region to be displayed by the map. | ||
* | ||
* The region is defined by the center coordinates and the span of | ||
* coordinates to display. | ||
*/ | ||
region: React.PropTypes.shape({ | ||
/** | ||
* Coordinates for the center of the map. | ||
*/ | ||
latitude: React.PropTypes.number.isRequired, | ||
longitude: React.PropTypes.number.isRequired, | ||
|
||
/** | ||
* Distance between the minimun and the maximum latitude/longitude | ||
* to be displayed. | ||
*/ | ||
latitudeDelta: React.PropTypes.number.isRequired, | ||
longitudeDelta: React.PropTypes.number.isRequired, | ||
}), | ||
|
||
/** | ||
* Maximum size of area that can be displayed. | ||
*/ | ||
maxDelta: React.PropTypes.number, | ||
|
||
/** | ||
* Minimum size of area that can be displayed. | ||
*/ | ||
minDelta: React.PropTypes.number, | ||
|
||
/** | ||
* Insets for the map's legal label, originally at bottom left of the map. | ||
* See `EdgeInsetsPropType.js` for more information. | ||
*/ | ||
legalLabelInsets: EdgeInsetsPropType, | ||
|
||
/** | ||
* Callback that is called continuously when the user is dragging the map. | ||
*/ | ||
onRegionChange: React.PropTypes.func, | ||
|
||
/** | ||
* Callback that is called once, when the user is done moving the map. | ||
*/ | ||
onRegionChangeComplete: React.PropTypes.func, | ||
}, | ||
|
||
_onChange: function(event) { | ||
if (event.nativeEvent.continuous) { | ||
this.props.onRegionChange && | ||
this.props.onRegionChange(event.nativeEvent.region); | ||
} else { | ||
this.props.onRegionChangeComplete && | ||
this.props.onRegionChangeComplete(event.nativeEvent.region); | ||
} | ||
}, | ||
|
||
render: function() { | ||
return ( | ||
<RKMap | ||
style={this.props.style} | ||
showsUserLocation={this.props.showsUserLocation} | ||
zoomEnabled={this.props.zoomEnabled} | ||
rotateEnabled={this.props.rotateEnabled} | ||
pitchEnabled={this.props.pitchEnabled} | ||
scrollEnabled={this.props.scrollEnabled} | ||
region={this.props.region} | ||
maxDelta={this.props.maxDelta} | ||
minDelta={this.props.minDelta} | ||
legalLabelInsets={this.props.legalLabelInsets} | ||
onChange={this._onChange} | ||
onTouchStart={this.props.onTouchStart} | ||
/> | ||
); | ||
}, | ||
|
||
}); | ||
|
||
var RKMap = createReactIOSNativeComponentClass({ | ||
validAttributes: merge( | ||
ReactIOSViewAttributes.UIView, { | ||
showsUserLocation: true, | ||
zoomEnabled: true, | ||
rotateEnabled: true, | ||
pitchEnabled: true, | ||
scrollEnabled: true, | ||
region: {diff: deepDiffer}, | ||
maxDelta: true, | ||
minDelta: true, | ||
legalLabelInsets: {diff: insetsDiffer}, | ||
} | ||
), | ||
uiViewClassName: 'RCTMap', | ||
}); | ||
|
||
module.exports = MapView; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.