index.js 13.6 KB
Newer Older
xwenliang's avatar
xwenliang committed
1 2 3 4 5 6 7 8 9
'use strict';

import React, {
	StyleSheet, 
	PropTypes, 
	View, 
	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 21 22
let width = Dimensions.get('window').width;
let height = Dimensions.get('window').height;

export default class PickerAny extends React.Component {

xwenliang's avatar
bugs  
xwenliang committed
23
	static propTypes = {
xwenliang's avatar
xwenliang committed
24
		pickerBtnText: PropTypes.string,
25
		pickerCancelBtnText: PropTypes.string,
xwenliang's avatar
xwenliang committed
26
		pickerBtnStyle: PropTypes.any,
27 28
		pickerTitle: PropTypes.string,
		pickerTitleStyle: PropTypes.any,
xwenliang's avatar
xwenliang committed
29 30
		pickerToolBarStyle: PropTypes.any,
		pickerItemStyle: PropTypes.any,
Jim Cummins's avatar
Jim Cummins committed
31
		pickerWidth: PropTypes.number,
xwenliang's avatar
bugs  
xwenliang committed
32 33
		pickerHeight: PropTypes.number,
		showDuration: PropTypes.number,
xwenliang's avatar
xwenliang committed
34 35
		pickerData: PropTypes.any.isRequired,
		selectedValue: PropTypes.any.isRequired,
36
		onPickerDone: PropTypes.func,
xwenliang's avatar
xwenliang committed
37 38
		onPickerCancel: PropTypes.func,
		onValueChange: PropTypes.func
xwenliang's avatar
xwenliang committed
39
	};
xwenliang's avatar
bugs  
xwenliang committed
40 41

	static defaultProps = {
xwenliang's avatar
xwenliang committed
42
		pickerBtnText: '完成',
43
		pickerCancelBtnText: '取消',
xwenliang's avatar
xwenliang committed
44
		pickerHeight: 250,
xwenliang's avatar
bugs  
xwenliang committed
45
		showDuration: 300,
46
		onPickerDone: ()=>{},
xwenliang's avatar
xwenliang committed
47
		onPickerCancel: ()=>{},
Jim Cummins's avatar
Jim Cummins committed
48 49
		onValueChange: ()=>{},
		pickerWidth: width > height ? height:width
xwenliang's avatar
xwenliang committed
50
	};
xwenliang's avatar
bugs  
xwenliang committed
51

xwenliang's avatar
xwenliang committed
52 53
	constructor(props, context){
		super(props, context);
xwenliang's avatar
xwenliang committed
54 55 56 57 58 59 60 61 62 63 64
	}

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

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

xwenliang's avatar
xwenliang committed
65
	shouldComponentUpdate(nextProps, nextState, context){
Jim Cummins's avatar
Jim Cummins committed
66 67 68
		if(nextState.pickerWidth !== this.state.pickerWidth) {
			return true;
		}
xwenliang's avatar
xwenliang committed
69 70
		if(JSON.stringify(nextState.selectedValue) === JSON.stringify(this.state.selectedValue)){
			return false;
xwenliang's avatar
xwenliang committed
71
		}
xwenliang's avatar
xwenliang committed
72 73
		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
		let style = props.style;
xwenliang's avatar
xwenliang committed
79
		let pickerBtnText = props.pickerBtnText;
80
		let pickerCancelBtnText = props.pickerCancelBtnText;
xwenliang's avatar
xwenliang committed
81
		let pickerBtnStyle = props.pickerBtnStyle;
82 83
		let pickerTitle = props.pickerTitle;
		let pickerTitleStyle = props.pickerTitleStyle;
xwenliang's avatar
xwenliang committed
84 85
		let pickerToolBarStyle = props.pickerToolBarStyle;
		let pickerItemStyle = props.pickerItemStyle;
Jim Cummins's avatar
Jim Cummins committed
86
		let pickerWidth = props.pickerWidth;
xwenliang's avatar
xwenliang committed
87 88 89 90 91
		let pickerHeight = props.pickerHeight;
		let showDuration = props.showDuration;
		let pickerData = props.pickerData;
		let selectedValue = props.selectedValue;
		let onPickerDone = props.onPickerDone;
92
		let onPickerCancel = props.onPickerCancel;
xwenliang's avatar
xwenliang committed
93
		let onValueChange = props.onValueChange;
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 = {};
Jon's avatar
Jon committed
104 105
		let slideAnim = (this.state && this.state.slideAnim ? this.state.slideAnim : new Animated.Value(-props.pickerHeight));
		
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
			pickerToolBarStyle,
			pickerItemStyle,
Jim Cummins's avatar
Jim Cummins committed
134
			pickerWidth,
xwenliang's avatar
xwenliang committed
135 136
			pickerHeight,
			showDuration,
xwenliang's avatar
xwenliang committed
137
			pickerData,
xwenliang's avatar
xwenliang committed
138 139
			selectedValue,
			onPickerDone,
140
			onPickerCancel,
xwenliang's avatar
xwenliang committed
141
			onValueChange,
xwenliang's avatar
xwenliang committed
142 143 144 145
			//list of first wheel data
			firstWheelData,
			//first wheel selected value
			firstPickedData,
Jon's avatar
Jon committed
146
			slideAnim,
xwenliang's avatar
xwenliang committed
147 148 149 150 151 152
			//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
153
		};
xwenliang's avatar
bugs  
xwenliang committed
154 155 156
	}

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

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

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

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

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

227 228 229 230 231
	_pickerCancel() {
		this._toggle();
		this.state.onPickerCancel();
	}

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

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

		return (
Jim Cummins's avatar
Jim Cummins committed
351
			<View style={[styles.pickerWrap, { width: this.state.pickerWidth }]}>
xwenliang's avatar
xwenliang committed
352 353 354
				<View style={styles.pickerWheel}>
					<Picker
						ref={'firstWheel'}
xwenliang's avatar
xwenliang committed
355
						selectedValue={this.state.firstPickedData}
xwenliang's avatar
xwenliang committed
356 357
						onValueChange={value => {
							let secondWheelData = Object.keys(pickerData[value]);
xwenliang's avatar
xwenliang committed
358
							let cascadeData = this._getCascadeData(pickerData, this.pickedValue, value, secondWheelData[0]);
xwenliang's avatar
xwenliang committed
359 360 361
							//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
362
								this.pickedValue.splice(0, 3, value, cascadeData.secondWheelData[0], cascadeData.thirdWheelData[0]);
xwenliang's avatar
xwenliang committed
363 364
							}
							else{
xwenliang's avatar
xwenliang committed
365
								this.pickedValue.splice(0, 2, value, cascadeData.secondWheelData[0]);
xwenliang's avatar
xwenliang committed
366 367
							}
							
xwenliang's avatar
xwenliang committed
368
							this.setState({
xwenliang's avatar
xwenliang committed
369
								selectedValue: 'wheel1'+value,
xwenliang's avatar
xwenliang committed
370 371 372 373 374 375
								firstPickedData: value,
								secondWheelData: cascadeData.secondWheelData,
								secondPickedDataIndex: 0,
								thirdWheelData: cascadeData.thirdWheelData,
								thirdPickedDataIndex: 0
							});
xwenliang's avatar
xwenliang committed
376 377 378
							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
379
						}} >
xwenliang's avatar
xwenliang committed
380
						{this.state.firstWheelData.map((value, index) => (
xwenliang's avatar
xwenliang committed
381 382 383
							<PickerItem
								key={index}
								value={value}
xwenliang's avatar
xwenliang committed
384
								label={value.toString()}
xwenliang's avatar
xwenliang committed
385 386 387 388 389 390 391
							/>)
						)}
					</Picker>
				</View>
				<View style={styles.pickerWheel}>
					<Picker
						ref={'secondWheel'}
xwenliang's avatar
xwenliang committed
392
						selectedValue={this.state.secondPickedDataIndex}
xwenliang's avatar
xwenliang committed
393
						onValueChange={(index) => {
xwenliang's avatar
xwenliang committed
394
							let thirdWheelData = pickerData[this.state.firstPickedData][this.state.secondWheelData[index]];
xwenliang's avatar
xwenliang committed
395
							if(thirdWheelData){
xwenliang's avatar
xwenliang committed
396
								this.pickedValue.splice(1, 2, this.state.secondWheelData[index], thirdWheelData[0]);	
xwenliang's avatar
xwenliang committed
397 398
							}
							else{
xwenliang's avatar
xwenliang committed
399
								this.pickedValue.splice(1, 1, this.state.secondWheelData[index]);
xwenliang's avatar
xwenliang committed
400 401
							}
							
xwenliang's avatar
xwenliang committed
402
							this.setState({
xwenliang's avatar
xwenliang committed
403 404
								secondPickedDataIndex: index,
								thirdWheelData,
xwenliang's avatar
xwenliang committed
405 406
								thirdPickedDataIndex: 0,
								selectedValue: 'wheel2'+index
xwenliang's avatar
xwenliang committed
407
							});
xwenliang's avatar
xwenliang committed
408 409
							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
410
						}} >
xwenliang's avatar
xwenliang committed
411
						{this.state.secondWheelData.map((value, index) => (
xwenliang's avatar
xwenliang committed
412 413 414
							<PickerItem
								key={index}
								value={index}
xwenliang's avatar
xwenliang committed
415
								label={value.toString()}
xwenliang's avatar
xwenliang committed
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
							/>)
						)}
					</Picker>
				</View>
				{thirdWheel}
			</View>
		);
	}

	_renderWheel(pickerData){
		/*
			some sences:
			1.	single wheel:
				[1,2,3,4]
			2.	two or more:
				[
					[1,2,3,4],
					[5,6,7,8],
					...
				]
			3.	two stage cascade:
				{
					a: [1,2,3,4],
					b: [5,6,7,8],
					...
				}
			4.	three stage cascade:
				{
					a: {
						a1: [1,2,3,4],
						a2: [5,6,7,8],
						a3: [9,10,11,12]
					},
					b: {
						b1: [1,2,3,4],
						b2: [5,6,7,8],
						b3: [9,10,12,12]
					}
					...
				}
			we call 1、2 parallel and 3、4 cascade
		*/
		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
466
	}
xwenliang's avatar
xwenliang committed
467 468
	
	render(){
xwenliang's avatar
bugs  
xwenliang committed
469 470
		return (
			<Animated.View style={[styles.picker, {
Jim Cummins's avatar
Jim Cummins committed
471
				width: this.state.pickerWidth,
xwenliang's avatar
xwenliang committed
472
				height: this.state.pickerHeight,
xwenliang's avatar
bugs  
xwenliang committed
473
				bottom: this.state.slideAnim
xwenliang's avatar
xwenliang committed
474
			}, this.state.style]}>
Jim Cummins's avatar
Jim Cummins committed
475
				<View style={[styles.pickerToolbar, this.state.pickerToolBarStyle, { width: this.state.pickerWidth }]}>
476 477
					<View style={styles.pickerCancelBtn}>
						<Text style={[styles.pickerFinishBtnText, this.state.pickerBtnStyle]}
478
							onPress={this._pickerCancel.bind(this)}>{this.state.pickerCancelBtnText}</Text>
479 480 481 482
					</View>
					<Text style={[styles.pickerTitle, this.state.pickerTitleStyle]} numberOfLines={1}>
						{this.state.pickerTitle}
					</Text>
xwenliang's avatar
bugs  
xwenliang committed
483
					<View style={styles.pickerFinishBtn}>
xwenliang's avatar
xwenliang committed
484 485
						<Text style={[styles.pickerFinishBtnText, this.state.pickerBtnStyle]}
							onPress={this._pickerFinish.bind(this)}>{this.state.pickerBtnText}</Text>
xwenliang's avatar
bugs  
xwenliang committed
486 487
					</View>
				</View>
xwenliang's avatar
xwenliang committed
488 489 490
				<View style={styles.pickerWrap}>
					{this._renderWheel(this.state.pickerData)}
				</View>
xwenliang's avatar
bugs  
xwenliang committed
491 492 493
			</Animated.View>
		);
	}
xwenliang's avatar
xwenliang committed
494 495 496
};

let styles = StyleSheet.create({
xwenliang's avatar
bugs  
xwenliang committed
497
	picker: {
xwenliang's avatar
xwenliang committed
498 499 500
		position: 'absolute',
		bottom: 0,
		left: 0,
xwenliang's avatar
bugs  
xwenliang committed
501
		backgroundColor: '#bdc0c7',
xwenliang's avatar
xwenliang committed
502 503 504 505 506 507 508
		overflow: 'hidden'
	},
	pickerWrap: {
		flexDirection: 'row'
	},
	pickerWheel: {
		flex: 1
xwenliang's avatar
xwenliang committed
509 510 511 512 513 514 515
	},
	pickerToolbar: {
		height: 30,
		backgroundColor: '#e6e6e6',
		flexDirection: 'row',
		borderTopWidth: 1,
		borderBottomWidth: 1,
xwenliang's avatar
xwenliang committed
516 517
		borderColor: '#c3c3c3',
		alignItems: 'center'
xwenliang's avatar
xwenliang committed
518 519 520 521 522
	},
	pickerBtnView: {
		flex: 1,
		flexDirection: 'row',
		justifyContent: 'flex-start',
xwenliang's avatar
bugs  
xwenliang committed
523
		alignItems: 'center'
xwenliang's avatar
xwenliang committed
524 525 526 527
	},
	pickerMoveBtn: {
		color: '#149be0',
		fontSize: 16,
xwenliang's avatar
bugs  
xwenliang committed
528
		marginLeft: 20
xwenliang's avatar
xwenliang committed
529
	},
530 531 532 533 534 535 536 537
	pickerCancelBtn: {
		flex: 1,
		flexDirection: 'row',
		justifyContent: 'flex-start',
		alignItems: 'center',
		marginLeft: 20
	},
	pickerTitle: {
xwenliang's avatar
xwenliang committed
538
		flex: 4,
539 540 541
		color: 'black',
		textAlign: 'center'
	},
xwenliang's avatar
xwenliang committed
542 543 544 545 546
	pickerFinishBtn: {
		flex: 1,
		flexDirection: 'row',
		justifyContent: 'flex-end',
		alignItems: 'center',
xwenliang's avatar
bugs  
xwenliang committed
547
		marginRight: 20
xwenliang's avatar
xwenliang committed
548 549 550 551 552 553
	},
	pickerFinishBtnText: {
		fontSize: 16,
		color: '#149be0'
	}
});