Pickerでエンドレスなロールを作る方法 – Ni chicha, ni limona — paellaの日記 – iPhoneアプリ開発グループ

上記エントリのコメントで紹介されていた下記エントリを試してみました。下記エントリからプロジェクトを zip で落とせるのですぐに試せます。

Pauldy’s House of Geek ? Blog Archive ? The Abusive PickerView

e38394e382afe38381e383a3-15

発想が面白いと思います。要素としては10個の配列を用意しておき、pickerView:numberOfRowsInComponent: で 16384 個あると返しておき、pickerViewLoaded で10個の配列に置き換えている。回転が止まると pickerView:didSelectRow:inComponent: でロールを中央の10個に移動するので、連続で回転させないと終端まで行かない。仮にがんばって終端まで連続して回転させても(がんばってやってみた)そこで回転が止まり pickerView:didSelectRow:inComponent: が呼ばれるので結局エンドレスなロールになる。

実機とシュミレータで試してみましたがスムーズにエンドレスなロールが実現されています。

- (void)applicationDidFinishLaunching:(UIApplication *)application {
	// Override point for customization after app launch
	myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 20, 300, 120)];
	myPickerView.delegate = self;
        [window addSubview:viewController.view];
	[window addSubview:myPickerView];
	[window makeKeyAndVisible];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSUInteger)row forComponent:(NSUInteger)component; {
	NSMutableArray *strings = [NSMutableArray arrayWithCapacity:10];
	[strings addObject:@"Zero"];
	[strings addObject:@"One"];
	[strings addObject:@"Two"];
	[strings addObject:@"Three"];
	[strings addObject:@"Four"];
	[strings addObject:@"Five"];
	[strings addObject:@"Six"];
	[strings addObject:@"Seven"];
	[strings addObject:@"Eight"];
	[strings addObject:@"Nine"];
	return [strings objectAtIndex:(row%10)];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSUInteger)row inComponent:(NSUInteger)component {
	[self pickerViewLoaded:nil];
}

- (NSUInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSUInteger)component {
	return 16384;
}

-(void)pickerViewLoaded: (id)blah {
	NSUInteger max = 16384;
	NSUInteger base10 = (max/2)-(max/2)%10;
	[myPickerView selectRow:[myPickerView selectedRowInComponent:0]%10+base10 inComponent:0 animated:false];
}

- (NSUInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
	return 1;
}

関連する投稿