[iPhone] UIPickerView でエンドレスなロールを作る」というエントリで紹介した下記サイトのソースを参考にオドメータ(距離計)のようなものを作ってみた。
Pauldy’s House of Geek ? Blog Archive ? The Abusive PickerView

今回は1秒毎にカウントアップするようにしてみました。

e38394e382afe38381e383a3-33

何に使えるかよく分かりませんが、前回のエントリを書いた時にオドメータが思い浮かんだので作ってみました。
下のソースでは myPickerView.userInteractionEnabled = NO; としてユーザが Picker を操作できないようにしていますが、弄れるようにしてもそれはそれで面白いかも。

変更した部分のソース

@interface UIPickerViewUAppDelegate : NSObject  {
	IBOutlet UIWindow *window;
	IBOutlet UIPickerViewUViewController *viewController;
	UIPickerView *myPickerView;
	int odd;
}

@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) UIPickerViewUViewController *viewController;
@property (nonatomic, retain) UIPickerView *myPickerView;

- (void) incrementOdd:(NSTimer*)timer;

@end

@implementation UIPickerViewUAppDelegate

- (void)applicationDidFinishLaunching:(UIApplication *)application {
	myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 20, 300, 120)];
	myPickerView.userInteractionEnabled = NO;
	myPickerView.delegate = self;
        [window addSubview:viewController.view];
	[window addSubview:myPickerView];
	[window makeKeyAndVisible];

	odd = 0;
	[NSTimer scheduledTimerWithTimeInterval:1.0
							        target:self
							     selector:@selector(incrementOdd:)
							     userInfo:nil
							      repeats:YES
        ];

}

- (void) incrementOdd:(NSTimer*)timer {
	odd++;

	NSUInteger max = 16384;
	NSUInteger base10 = (max/2)-(max/2)%10;
	int meter = odd;
	for (int i=4; i>=0; i--) {
		int currentPicker = [myPickerView selectedRowInComponent:i];
		int prevNumber = currentPicker-base10;
		int nextNumber = meter%10;
		if (prevNumber!=nextNumber) {
			[myPickerView selectRow:++currentPicker inComponent:i animated:YES];
			if (nextNumber==0) {
				[myPickerView selectRow:meter%10+base10 inComponent:i animated:NO];
			}
		}
		meter /= 10;
	}
}

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

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

関連する投稿