index.js 13.2 KB
Newer Older
xwenliang's avatar
xwenliang committed
1 2 3
'use strict';

import React, {
4 5 6
	StyleSheet,
	PropTypes,
	View,
xwenliang's avatar
xwenliang committed
7 8 9
	Text,
	Animated,
	Platform,
xwenliang's avatar
bugs  
xwenliang committed
10 11
	Dimensions,
	PickerIOS
xwenliang's avatar
xwenliang committed
12 13 14 15 16
} from 'react-native';

import PickerAndroid from 'react-native-picker-android';

let Picker = Platform.OS === 'ios' ? PickerIOS : PickerAndroid;
xwenliang's avatar
xwenliang committed
17
let PickerItem = Picker.Item;
xwenliang's avatar
xwenliang committed
18 19 20
let width = Dimensions.get('window').width;
let height = Dimensions.get('window').height;

21 22 23
const longSide = width > height ? width : height;
const shortSide = width > height ? height : width;

xwenliang's avatar
xwenliang committed
24 25
export default class PickerAny extends React.Component {

xwenliang's avatar
bugs  
xwenliang committed
26
	static propTypes = {
xwenliang's avatar
xwenliang committed
27
		style: PropTypes.any,
xwenliang's avatar
xwenliang committed
28
		pickerElevation: PropTypes.number,
xwenliang's avatar
xwenliang committed
29
		pickerBtnText: PropTypes.string,
30
		pickerCancelBtnText: PropTypes.string,
xwenliang's avatar
xwenliang committed
31
		pickerBtnStyle: PropTypes.any,
32 33
		pickerTitle: PropTypes.string,
		pickerTitleStyle: PropTypes.any,
xwenliang's avatar
xwenliang committed
34 35
		pickerToolBarStyle: PropTypes.any,
		pickerItemStyle: PropTypes.any,
xwenliang's avatar
xwenliang committed
36
		showMask: PropTypes.bool,
xwenliang's avatar
bugs  
xwenliang committed
37
		showDuration: PropTypes.number,
xwenliang's avatar
xwenliang committed
38 39
		pickerData: PropTypes.any.isRequired,
		selectedValue: PropTypes.any.isRequired,
40
		onPickerDone: PropTypes.func,
xwenliang's avatar
xwenliang committed
41 42
		onPickerCancel: PropTypes.func,
		onValueChange: PropTypes.func
xwenliang's avatar
xwenliang committed
43
	};
xwenliang's avatar
bugs  
xwenliang committed
44 45

	static defaultProps = {
xwenliang's avatar
xwenliang committed
46 47 48 49 50 51
		style: {
			width: width
		},
		pickerBtnText: 'Done',
		pickerCancelBtnText: 'Cancel',
		showMask: false,
xwenliang's avatar
bugs  
xwenliang committed
52
		showDuration: 300,
53
		onPickerDone: ()=>{},
xwenliang's avatar
xwenliang committed
54
		onPickerCancel: ()=>{},
xwenliang's avatar
xwenliang committed
55
		onValueChange: ()=>{}
xwenliang's avatar
xwenliang committed
56
	};
xwenliang's avatar
bugs  
xwenliang committed
57

xwenliang's avatar
xwenliang committed
58 59
	constructor(props, context){
		super(props, context);
xwenliang's avatar
xwenliang committed
60 61 62 63 64 65 66 67 68 69 70
	}

	componentWillMount(){
		this.state = this._getStateFromProps(this.props);
	}

	componentWillReceiveProps(newProps){
		let newState = this._getStateFromProps(newProps);
		this.setState(newState);
	}

xwenliang's avatar
xwenliang committed
71 72 73
	shouldComponentUpdate(nextProps, nextState, context){
		return true;
	}
xwenliang's avatar
xwenliang committed
74

xwenliang's avatar
xwenliang committed
75
	_getStateFromProps(props){
xwenliang's avatar
xwenliang committed
76
		//the pickedValue must looks like [wheelone's, wheeltwo's, ...]
xwenliang's avatar
xwenliang committed
77
		//this.state.selectedValue may be the result of the first pickerWheel
xwenliang's avatar
xwenliang committed
78 79
		let {
			style,
xwenliang's avatar
xwenliang committed
80
			pickerElevation,
xwenliang's avatar
xwenliang committed
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
			pickerBtnText,
			pickerCancelBtnText,
			pickerBtnStyle,
			pickerTitle,
			pickerTitleStyle,
			pickerToolBarStyle,
			pickerItemStyle,
			showDuration,
			showMask,
			pickerData,
			selectedValue,
			onPickerDone,
			onPickerCancel,
			onValueChange
		} = props;
xwenliang's avatar
xwenliang committed
96

xwenliang's avatar
xwenliang committed
97 98 99
		let pickerStyle = pickerData.constructor === Array ? 'parallel' : 'cascade';
		let firstWheelData;
		let firstPickedData;
Zuxuan Liang's avatar
Debug  
Zuxuan Liang committed
100
		let secondPickedData;
xwenliang's avatar
xwenliang committed
101 102 103 104 105
		let secondWheelData;
		let secondPickedDataIndex;
		let thirdWheelData;
		let thirdPickedDataIndex;
		let cascadeData = {};
xwenliang's avatar
xwenliang committed
106
		let slideAnim = (this.state && this.state.slideAnim ? this.state.slideAnim : new Animated.Value(-height));
107

xwenliang's avatar
xwenliang committed
108 109
		if(pickerStyle === 'parallel'){
			//compatible single wheel sence
xwenliang's avatar
xwenliang committed
110 111
			if(selectedValue.constructor !== Array){
				selectedValue = [selectedValue];
xwenliang's avatar
xwenliang committed
112 113 114 115 116 117 118 119
			}
			if(pickerData[0].constructor !== Array){
				pickerData = [pickerData];
			}
		}
		else if(pickerStyle === 'cascade'){
			//only support three stage
			firstWheelData = Object.keys(pickerData);
xwenliang's avatar
xwenliang committed
120 121 122
			firstPickedData = props.selectedValue[0];
			secondPickedData = props.selectedValue[1];
			cascadeData = this._getCascadeData(pickerData, selectedValue, firstPickedData, secondPickedData, true);
xwenliang's avatar
xwenliang committed
123
		}
xwenliang's avatar
xwenliang committed
124
		//save picked data
xwenliang's avatar
xwenliang committed
125
		this.pickedValue = JSON.parse(JSON.stringify(selectedValue));
xwenliang's avatar
xwenliang committed
126 127
		this.pickerStyle = pickerStyle;
		return {
xwenliang's avatar
xwenliang committed
128
			style,
xwenliang's avatar
xwenliang committed
129
			pickerElevation,
xwenliang's avatar
xwenliang committed
130
			pickerBtnText,
131
			pickerCancelBtnText,
xwenliang's avatar
xwenliang committed
132
			pickerBtnStyle,
133 134
			pickerTitle,
			pickerTitleStyle,
xwenliang's avatar
xwenliang committed
135 136 137
			pickerToolBarStyle,
			pickerItemStyle,
			showDuration,
xwenliang's avatar
xwenliang committed
138
			showMask,
xwenliang's avatar
xwenliang committed
139
			pickerData,
xwenliang's avatar
xwenliang committed
140 141
			selectedValue,
			onPickerDone,
142
			onPickerCancel,
xwenliang's avatar
xwenliang committed
143
			onValueChange,
xwenliang's avatar
xwenliang committed
144 145 146 147
			//list of first wheel data
			firstWheelData,
			//first wheel selected value
			firstPickedData,
Jon's avatar
Jon committed
148
			slideAnim,
xwenliang's avatar
xwenliang committed
149 150 151 152 153 154
			//list of second wheel data and pickedDataIndex
			secondWheelData: cascadeData.secondWheelData,
			secondPickedDataIndex: cascadeData.secondPickedDataIndex,
			//third wheel selected value and pickedDataIndex
			thirdWheelData: cascadeData.thirdWheelData,
			thirdPickedDataIndex: cascadeData.thirdPickedDataIndex
xwenliang's avatar
xwenliang committed
155
		};
xwenliang's avatar
bugs  
xwenliang committed
156 157 158
	}

	_slideUp(){
xwenliang's avatar
xwenliang committed
159
		this._isMoving = true;
xwenliang's avatar
bugs  
xwenliang committed
160 161 162 163
		Animated.timing(
			this.state.slideAnim,
			{
				toValue: 0,
xwenliang's avatar
xwenliang committed
164
				duration: this.state.showDuration,
xwenliang's avatar
bugs  
xwenliang committed
165 166 167
			}
		).start((evt) => {
			if(evt.finished) {
xwenliang's avatar
xwenliang committed
168 169
				this._isMoving = false;
				this._isPickerShow = true;
xwenliang's avatar
bugs  
xwenliang committed
170 171 172 173 174
			}
		});
	}

	_slideDown(){
xwenliang's avatar
xwenliang committed
175
		this._isMoving = true;
xwenliang's avatar
bugs  
xwenliang committed
176 177 178
		Animated.timing(
			this.state.slideAnim,
			{
xwenliang's avatar
xwenliang committed
179
				toValue: -height,
xwenliang's avatar
xwenliang committed
180
				duration: this.state.showDuration,
xwenliang's avatar
bugs  
xwenliang committed
181 182 183
			}
		).start((evt) => {
			if(evt.finished) {
xwenliang's avatar
xwenliang committed
184 185
				this._isMoving = false;
				this._isPickerShow = false;
xwenliang's avatar
bugs  
xwenliang committed
186 187 188 189 190
			}
		});
	}

	_toggle(){
xwenliang's avatar
xwenliang committed
191
		if(this._isMoving) {
xwenliang's avatar
bugs  
xwenliang committed
192 193
			return;
		}
xwenliang's avatar
xwenliang committed
194
		if(this._isPickerShow) {
xwenliang's avatar
bugs  
xwenliang committed
195 196 197 198 199 200 201 202 203 204
			this._slideDown();
		}
		else{
			this._slideUp();
		}
	}
	//向父组件提供方法
	toggle(){
		this._toggle();
	}
xwenliang's avatar
xwenliang committed
205 206 207 208 209 210 211 212 213 214 215 216 217
	show(){
		if(!this._isPickerShow){
			this._slideUp();
		}
	}
	hide(){
		if(this._isPickerShow){
			this._slideDown();
		}
	}
	isPickerShow(){
		return this._isPickerShow;
	}
xwenliang's avatar
xwenliang committed
218 219

	_prePressHandle(callback){
xwenliang's avatar
bugs  
xwenliang committed
220 221 222
		//通知子组件往上滚
		this.pickerWheel.moveUp();
	}
xwenliang's avatar
xwenliang committed
223 224

	_nextPressHandle(callback){
xwenliang's avatar
bugs  
xwenliang committed
225 226 227 228
		//通知子组件往下滚
		this.pickerWheel.moveDown();
	}

xwenliang's avatar
xwenliang committed
229
	_pickerCancel(){
230 231 232 233
		this._toggle();
		this.state.onPickerCancel();
	}

xwenliang's avatar
bugs  
xwenliang committed
234 235
	_pickerFinish(){
		this._toggle();
xwenliang's avatar
xwenliang committed
236
		this.state.onPickerDone(this.pickedValue);
xwenliang's avatar
xwenliang committed
237 238 239 240 241
	}

	_renderParallelWheel(pickerData){
		return pickerData.map((item, index) => {
			return (
xwenliang's avatar
xwenliang committed
242
				<View style={styles.pickerWheel} key={index}>
xwenliang's avatar
xwenliang committed
243
					<Picker
xwenliang's avatar
xwenliang committed
244
						selectedValue={this.state.selectedValue[index]}
xwenliang's avatar
xwenliang committed
245
						onValueChange={value => {
xwenliang's avatar
xwenliang committed
246
							this.pickedValue.splice(index, 1, value);
xwenliang's avatar
xwenliang committed
247
							//do not set state to another object!! why?
xwenliang's avatar
xwenliang committed
248 249
							// this.setState({
							// 	selectedValue: this.pickedValue
xwenliang's avatar
xwenliang committed
250
							// });
xwenliang's avatar
xwenliang committed
251 252
							this.setState({
								selectedValue: JSON.parse(JSON.stringify(this.pickedValue))
xwenliang's avatar
xwenliang committed
253
							});
xwenliang's avatar
xwenliang committed
254
							this.state.onValueChange(JSON.parse(JSON.stringify(this.pickedValue)), index);
xwenliang's avatar
xwenliang committed
255 256 257 258 259
						}} >
						{item.map((value, index) => (
							<PickerItem
								key={index}
								value={value}
xwenliang's avatar
xwenliang committed
260
								label={value.toString()}
xwenliang's avatar
xwenliang committed
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
							/>)
						)}
					</Picker>
				</View>
			);
		});
	}

	_getCascadeData(pickerData, pickedValue, firstPickedData, secondPickedData, onInit){
		let secondWheelData;
		let secondPickedDataIndex;
		let thirdWheelData;
		let thirdPickedDataIndex;
		//only support two and three stage
		for(let key in pickerData){
			//two stage
			if(pickerData[key].constructor === Array){
				secondWheelData = pickerData[firstPickedData];
				if(onInit){
					secondWheelData.forEach(function(v, k){
						if(v === pickedValue[1]){
							secondPickedDataIndex = k;
						}
					}.bind(this));
				}
				else{
					secondPickedDataIndex = 0;
				}
				break;
			}
			//three stage
			else{
				secondWheelData = Object.keys(pickerData[firstPickedData]);
				if(onInit){
					secondWheelData.forEach(function(v, k){
						if(v === pickedValue[1]){
							secondPickedDataIndex = k;
						}
					}.bind(this));
				}
				else{
					secondPickedDataIndex = 0;
				}
				thirdWheelData = pickerData[firstPickedData][secondPickedData];
				if(onInit){
					thirdWheelData.forEach(function(v, k){
						if(v === pickedValue[2]){
							thirdPickedDataIndex = k;
						}
					})
				}
				else{
					thirdPickedDataIndex = 0;
				}
				break;
			}
		}

		return {
			secondWheelData,
			secondPickedDataIndex,
			thirdWheelData,
			thirdPickedDataIndex
		}
	}

	_renderCascadeWheel(pickerData){
xwenliang's avatar
xwenliang committed
328
		let thirdWheel = this.state.thirdWheelData && (
xwenliang's avatar
xwenliang committed
329 330 331
			<View style={styles.pickerWheel}>
				<Picker
					ref={'thirdWheel'}
xwenliang's avatar
xwenliang committed
332
					selectedValue={this.state.thirdPickedDataIndex}
xwenliang's avatar
xwenliang committed
333
					onValueChange={(index) => {
xwenliang's avatar
xwenliang committed
334 335
						this.pickedValue.splice(2, 1, this.state.thirdWheelData[index]);
						this.setState({
xwenliang's avatar
xwenliang committed
336 337
							thirdPickedDataIndex: index,
							selectedValue: 'wheel3'+index
xwenliang's avatar
xwenliang committed
338
						});
xwenliang's avatar
xwenliang committed
339
						this.state.onValueChange(JSON.parse(JSON.stringify(this.pickedValue)), 2);
xwenliang's avatar
xwenliang committed
340
					}} >
xwenliang's avatar
xwenliang committed
341
					{this.state.thirdWheelData.map((value, index) => (
xwenliang's avatar
xwenliang committed
342 343 344
						<PickerItem
							key={index}
							value={index}
xwenliang's avatar
xwenliang committed
345
							label={value.toString()}
xwenliang's avatar
xwenliang committed
346 347 348 349 350 351 352
						/>)
					)}
				</Picker>
			</View>
		);

		return (
xwenliang's avatar
xwenliang committed
353
			<View style={[styles.pickerWrap, {width: this.state.style.width || width}]}>
xwenliang's avatar
xwenliang committed
354 355 356
				<View style={styles.pickerWheel}>
					<Picker
						ref={'firstWheel'}
xwenliang's avatar
xwenliang committed
357
						selectedValue={this.state.firstPickedData}
xwenliang's avatar
xwenliang committed
358 359
						onValueChange={value => {
							let secondWheelData = Object.keys(pickerData[value]);
xwenliang's avatar
xwenliang committed
360
							let cascadeData = this._getCascadeData(pickerData, this.pickedValue, value, secondWheelData[0]);
xwenliang's avatar
xwenliang committed
361 362 363
							//when onPicked, this.pickedValue will pass to the parent
							//when firstWheel changed, second and third will also change
							if(cascadeData.thirdWheelData){
xwenliang's avatar
xwenliang committed
364
								this.pickedValue.splice(0, 3, value, cascadeData.secondWheelData[0], cascadeData.thirdWheelData[0]);
xwenliang's avatar
xwenliang committed
365 366
							}
							else{
xwenliang's avatar
xwenliang committed
367
								this.pickedValue.splice(0, 2, value, cascadeData.secondWheelData[0]);
xwenliang's avatar
xwenliang committed
368
							}
369

xwenliang's avatar
xwenliang committed
370
							this.setState({
xwenliang's avatar
xwenliang committed
371
								selectedValue: 'wheel1'+value,
xwenliang's avatar
xwenliang committed
372 373 374 375 376 377
								firstPickedData: value,
								secondWheelData: cascadeData.secondWheelData,
								secondPickedDataIndex: 0,
								thirdWheelData: cascadeData.thirdWheelData,
								thirdPickedDataIndex: 0
							});
xwenliang's avatar
xwenliang committed
378 379 380
							this.state.onValueChange(JSON.parse(JSON.stringify(this.pickedValue)), 0);
							this.refs.secondWheel && this.refs.secondWheel.moveTo && this.refs.secondWheel.moveTo(0);
							this.refs.thirdWheel && this.refs.thirdWheel.moveTo && this.refs.thirdWheel.moveTo(0);
xwenliang's avatar
xwenliang committed
381
						}} >
xwenliang's avatar
xwenliang committed
382
						{this.state.firstWheelData.map((value, index) => (
xwenliang's avatar
xwenliang committed
383 384 385
							<PickerItem
								key={index}
								value={value}
xwenliang's avatar
xwenliang committed
386
								label={value.toString()}
xwenliang's avatar
xwenliang committed
387 388 389 390 391 392 393
							/>)
						)}
					</Picker>
				</View>
				<View style={styles.pickerWheel}>
					<Picker
						ref={'secondWheel'}
xwenliang's avatar
xwenliang committed
394
						selectedValue={this.state.secondPickedDataIndex}
xwenliang's avatar
xwenliang committed
395
						onValueChange={(index) => {
xwenliang's avatar
xwenliang committed
396
							let thirdWheelData = pickerData[this.state.firstPickedData][this.state.secondWheelData[index]];
xwenliang's avatar
xwenliang committed
397
							if(thirdWheelData){
398
								this.pickedValue.splice(1, 2, this.state.secondWheelData[index], thirdWheelData[0]);
xwenliang's avatar
xwenliang committed
399 400
							}
							else{
xwenliang's avatar
xwenliang committed
401
								this.pickedValue.splice(1, 1, this.state.secondWheelData[index]);
xwenliang's avatar
xwenliang committed
402
							}
403

xwenliang's avatar
xwenliang committed
404
							this.setState({
xwenliang's avatar
xwenliang committed
405 406
								secondPickedDataIndex: index,
								thirdWheelData,
xwenliang's avatar
xwenliang committed
407 408
								thirdPickedDataIndex: 0,
								selectedValue: 'wheel2'+index
xwenliang's avatar
xwenliang committed
409
							});
xwenliang's avatar
xwenliang committed
410 411
							this.state.onValueChange(JSON.parse(JSON.stringify(this.pickedValue)), 1);
							this.refs.thirdWheel && this.refs.thirdWheel.moveTo && this.refs.thirdWheel.moveTo(0);
xwenliang's avatar
xwenliang committed
412
						}} >
xwenliang's avatar
xwenliang committed
413
						{this.state.secondWheelData.map((value, index) => (
xwenliang's avatar
xwenliang committed
414 415 416
							<PickerItem
								key={index}
								value={index}
xwenliang's avatar
xwenliang committed
417
								label={value.toString()}
xwenliang's avatar
xwenliang committed
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
							/>)
						)}
					</Picker>
				</View>
				{thirdWheel}
			</View>
		);
	}

	_renderWheel(pickerData){
		let wheel = null;
		if(this.pickerStyle === 'parallel'){
			wheel = this._renderParallelWheel(pickerData);
		}
		else if(this.pickerStyle === 'cascade'){
			wheel = this._renderCascadeWheel(pickerData);
		}
		return wheel;
xwenliang's avatar
bugs  
xwenliang committed
436
	}
437

xwenliang's avatar
xwenliang committed
438
	render(){
xwenliang's avatar
xwenliang committed
439 440 441 442 443 444 445

		let mask = this.state.showMask ? (
			<View style={styles.mask} >
				<Text style={{width: width, height: height}} onPress={this._pickerCancel.bind(this)}></Text>
			</View>
		) : null;

xwenliang's avatar
bugs  
xwenliang committed
446 447
		return (
			<Animated.View style={[styles.picker, {
xwenliang's avatar
xwenliang committed
448
				elevation: this.state.pickerElevation,
449
				width: longSide,
xwenliang's avatar
xwenliang committed
450
				height: this.state.showMask ? height : this.state.style.height,
xwenliang's avatar
bugs  
xwenliang committed
451
				bottom: this.state.slideAnim
xwenliang's avatar
xwenliang committed
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
			}]}>
				{mask}
				<View style={[styles.pickerBox, this.state.style]}>
					<View style={[styles.pickerToolbar, this.state.pickerToolBarStyle, {width: this.state.style.width || width}]}>
						<View style={styles.pickerCancelBtn}>
							<Text style={[styles.pickerFinishBtnText, this.state.pickerBtnStyle]}
								onPress={this._pickerCancel.bind(this)}>{this.state.pickerCancelBtnText}</Text>
						</View>
						<Text style={[styles.pickerTitle, this.state.pickerTitleStyle]} numberOfLines={1}>
							{this.state.pickerTitle}
						</Text>
						<View style={styles.pickerFinishBtn}>
							<Text style={[styles.pickerFinishBtnText, this.state.pickerBtnStyle]}
								onPress={this._pickerFinish.bind(this)}>{this.state.pickerBtnText}</Text>
						</View>
467
					</View>
xwenliang's avatar
xwenliang committed
468 469
					<View style={[styles.pickerWrap, {width: this.state.style.width || width}]}>
						{this._renderWheel(this.state.pickerData)}
xwenliang's avatar
bugs  
xwenliang committed
470 471 472 473 474
					</View>
				</View>
			</Animated.View>
		);
	}
xwenliang's avatar
xwenliang committed
475 476 477
};

let styles = StyleSheet.create({
xwenliang's avatar
bugs  
xwenliang committed
478
	picker: {
xwenliang's avatar
xwenliang committed
479 480 481
		position: 'absolute',
		bottom: 0,
		left: 0,
xwenliang's avatar
xwenliang committed
482
		backgroundColor: 'transparent',
xwenliang's avatar
xwenliang committed
483 484
		overflow: 'hidden'
	},
xwenliang's avatar
xwenliang committed
485 486 487
	pickerBox: {
		position: 'absolute',
		bottom: 0,
xwenliang's avatar
xwenliang committed
488 489
		left: 0,
		backgroundColor: '#bdc0c7'
xwenliang's avatar
xwenliang committed
490 491 492 493 494 495 496 497
	},
	mask: {
		position: 'absolute',
		top: 0,
		backgroundColor: 'transparent',
		height: height,
		width: width
	},
xwenliang's avatar
xwenliang committed
498 499 500 501 502
	pickerWrap: {
		flexDirection: 'row'
	},
	pickerWheel: {
		flex: 1
xwenliang's avatar
xwenliang committed
503 504 505 506 507 508 509
	},
	pickerToolbar: {
		height: 30,
		backgroundColor: '#e6e6e6',
		flexDirection: 'row',
		borderTopWidth: 1,
		borderBottomWidth: 1,
xwenliang's avatar
xwenliang committed
510 511
		borderColor: '#c3c3c3',
		alignItems: 'center'
xwenliang's avatar
xwenliang committed
512 513 514 515 516
	},
	pickerBtnView: {
		flex: 1,
		flexDirection: 'row',
		justifyContent: 'flex-start',
xwenliang's avatar
bugs  
xwenliang committed
517
		alignItems: 'center'
xwenliang's avatar
xwenliang committed
518 519 520 521
	},
	pickerMoveBtn: {
		color: '#149be0',
		fontSize: 16,
xwenliang's avatar
bugs  
xwenliang committed
522
		marginLeft: 20
xwenliang's avatar
xwenliang committed
523
	},
524 525 526 527 528 529 530 531
	pickerCancelBtn: {
		flex: 1,
		flexDirection: 'row',
		justifyContent: 'flex-start',
		alignItems: 'center',
		marginLeft: 20
	},
	pickerTitle: {
xwenliang's avatar
xwenliang committed
532
		flex: 4,
533 534 535
		color: 'black',
		textAlign: 'center'
	},
xwenliang's avatar
xwenliang committed
536 537 538 539 540
	pickerFinishBtn: {
		flex: 1,
		flexDirection: 'row',
		justifyContent: 'flex-end',
		alignItems: 'center',
xwenliang's avatar
bugs  
xwenliang committed
541
		marginRight: 20
xwenliang's avatar
xwenliang committed
542 543 544 545 546 547
	},
	pickerFinishBtnText: {
		fontSize: 16,
		color: '#149be0'
	}
});