index.js 13 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
		pickerBtnText: PropTypes.string,
29
		pickerCancelBtnText: PropTypes.string,
xwenliang's avatar
xwenliang committed
30
		pickerBtnStyle: PropTypes.any,
31 32
		pickerTitle: PropTypes.string,
		pickerTitleStyle: PropTypes.any,
xwenliang's avatar
xwenliang committed
33 34
		pickerToolBarStyle: PropTypes.any,
		pickerItemStyle: PropTypes.any,
xwenliang's avatar
xwenliang committed
35
		showMask: PropTypes.bool,
xwenliang's avatar
bugs  
xwenliang committed
36
		showDuration: PropTypes.number,
xwenliang's avatar
xwenliang committed
37 38
		pickerData: PropTypes.any.isRequired,
		selectedValue: PropTypes.any.isRequired,
39
		onPickerDone: PropTypes.func,
xwenliang's avatar
xwenliang committed
40 41
		onPickerCancel: PropTypes.func,
		onValueChange: PropTypes.func
xwenliang's avatar
xwenliang committed
42
	};
xwenliang's avatar
bugs  
xwenliang committed
43 44

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

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

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

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

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

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

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

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

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

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

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

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

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

xwenliang's avatar
xwenliang committed
226
	_pickerCancel(){
227 228 229 230
		this._toggle();
		this.state.onPickerCancel();
	}

xwenliang's avatar
bugs  
xwenliang committed
231 232
	_pickerFinish(){
		this._toggle();
xwenliang's avatar
xwenliang committed
233
		this.state.onPickerDone(this.pickedValue);
xwenliang's avatar
xwenliang committed
234 235 236 237 238
	}

	_renderParallelWheel(pickerData){
		return pickerData.map((item, index) => {
			return (
xwenliang's avatar
xwenliang committed
239
				<View style={styles.pickerWheel} key={index}>
xwenliang's avatar
xwenliang committed
240
					<Picker
xwenliang's avatar
xwenliang committed
241
						selectedValue={this.state.selectedValue[index]}
xwenliang's avatar
xwenliang committed
242
						onValueChange={value => {
xwenliang's avatar
xwenliang committed
243
							this.pickedValue.splice(index, 1, value);
xwenliang's avatar
xwenliang committed
244
							//do not set state to another object!! why?
xwenliang's avatar
xwenliang committed
245 246
							// this.setState({
							// 	selectedValue: this.pickedValue
xwenliang's avatar
xwenliang committed
247
							// });
xwenliang's avatar
xwenliang committed
248 249
							this.setState({
								selectedValue: JSON.parse(JSON.stringify(this.pickedValue))
xwenliang's avatar
xwenliang committed
250
							});
xwenliang's avatar
xwenliang committed
251
							this.state.onValueChange(JSON.parse(JSON.stringify(this.pickedValue)), index);
xwenliang's avatar
xwenliang committed
252 253 254 255 256
						}} >
						{item.map((value, index) => (
							<PickerItem
								key={index}
								value={value}
xwenliang's avatar
xwenliang committed
257
								label={value.toString()}
xwenliang's avatar
xwenliang committed
258 259 260 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
							/>)
						)}
					</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
325
		let thirdWheel = this.state.thirdWheelData && (
xwenliang's avatar
xwenliang committed
326 327 328
			<View style={styles.pickerWheel}>
				<Picker
					ref={'thirdWheel'}
xwenliang's avatar
xwenliang committed
329
					selectedValue={this.state.thirdPickedDataIndex}
xwenliang's avatar
xwenliang committed
330
					onValueChange={(index) => {
xwenliang's avatar
xwenliang committed
331 332
						this.pickedValue.splice(2, 1, this.state.thirdWheelData[index]);
						this.setState({
xwenliang's avatar
xwenliang committed
333 334
							thirdPickedDataIndex: index,
							selectedValue: 'wheel3'+index
xwenliang's avatar
xwenliang committed
335
						});
xwenliang's avatar
xwenliang committed
336
						this.state.onValueChange(JSON.parse(JSON.stringify(this.pickedValue)), 2);
xwenliang's avatar
xwenliang committed
337
					}} >
xwenliang's avatar
xwenliang committed
338
					{this.state.thirdWheelData.map((value, index) => (
xwenliang's avatar
xwenliang committed
339 340 341
						<PickerItem
							key={index}
							value={index}
xwenliang's avatar
xwenliang committed
342
							label={value.toString()}
xwenliang's avatar
xwenliang committed
343 344 345 346 347 348 349
						/>)
					)}
				</Picker>
			</View>
		);

		return (
xwenliang's avatar
xwenliang committed
350
			<View style={[styles.pickerWrap, {width: this.state.style.width || width}]}>
xwenliang's avatar
xwenliang committed
351 352 353
				<View style={styles.pickerWheel}>
					<Picker
						ref={'firstWheel'}
xwenliang's avatar
xwenliang committed
354
						selectedValue={this.state.firstPickedData}
xwenliang's avatar
xwenliang committed
355 356
						onValueChange={value => {
							let secondWheelData = Object.keys(pickerData[value]);
xwenliang's avatar
xwenliang committed
357
							let cascadeData = this._getCascadeData(pickerData, this.pickedValue, value, secondWheelData[0]);
xwenliang's avatar
xwenliang committed
358 359 360
							//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
361
								this.pickedValue.splice(0, 3, value, cascadeData.secondWheelData[0], cascadeData.thirdWheelData[0]);
xwenliang's avatar
xwenliang committed
362 363
							}
							else{
xwenliang's avatar
xwenliang committed
364
								this.pickedValue.splice(0, 2, value, cascadeData.secondWheelData[0]);
xwenliang's avatar
xwenliang committed
365
							}
366

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

xwenliang's avatar
xwenliang committed
401
							this.setState({
xwenliang's avatar
xwenliang committed
402 403
								secondPickedDataIndex: index,
								thirdWheelData,
xwenliang's avatar
xwenliang committed
404 405
								thirdPickedDataIndex: 0,
								selectedValue: 'wheel2'+index
xwenliang's avatar
xwenliang committed
406
							});
xwenliang's avatar
xwenliang committed
407 408
							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
409
						}} >
xwenliang's avatar
xwenliang committed
410
						{this.state.secondWheelData.map((value, index) => (
xwenliang's avatar
xwenliang committed
411 412 413
							<PickerItem
								key={index}
								value={index}
xwenliang's avatar
xwenliang committed
414
								label={value.toString()}
xwenliang's avatar
xwenliang committed
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432
							/>)
						)}
					</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
433
	}
434

xwenliang's avatar
xwenliang committed
435
	render(){
xwenliang's avatar
xwenliang committed
436 437 438 439 440 441 442

		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
443 444
		return (
			<Animated.View style={[styles.picker, {
445
				width: longSide,
xwenliang's avatar
xwenliang committed
446
				height: this.state.showMask ? height : this.state.style.height,
xwenliang's avatar
bugs  
xwenliang committed
447
				bottom: this.state.slideAnim
xwenliang's avatar
xwenliang committed
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
			}]}>
				{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>
463
					</View>
xwenliang's avatar
xwenliang committed
464 465
					<View style={[styles.pickerWrap, {width: this.state.style.width || width}]}>
						{this._renderWheel(this.state.pickerData)}
xwenliang's avatar
bugs  
xwenliang committed
466 467 468 469 470
					</View>
				</View>
			</Animated.View>
		);
	}
xwenliang's avatar
xwenliang committed
471 472 473
};

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