web-dev-qa-db-ja.com

UIPickerViewコンポーネントをどのようにラップアラウンドしますか?

UIPickerViewコンポーネントに一連の連続した数値を表示したいのですが、Clock-> Timerアプリケーションのsecondsコンポーネントのように折り返します。有効にできる唯一の動作は、Timerアプリケーションの時間コンポーネントのように見えます。このアプリケーションでは、一方向にしかスクロールできません。

40
David

行数を大きな数に設定し、高い値から開始するのも同じくらい簡単です。ユーザーが非常に長い間ホイールをスクロールする可能性はほとんどありません。それでも、さらに悪いことになります。起こるのは彼らが底を打つということです。

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    // Near-infinite number of rows.
    return NSIntegerMax;
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    // Row n is same as row (n modulo numberItems).
    return [NSString stringWithFormat:@"%d", row % numberItems];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.pickerView = [[[UIPickerView alloc] initWithFrame:CGRectZero] autorelease];
    // ...set pickerView properties... Look at Apple's UICatalog sample code for a good example.
    // Set current row to a large value (adjusted to current value if needed).
    [pickerView selectRow:currentValue+100000 inComponent:0 animated:NO];
    [self.view addSubview:pickerView];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    NSInteger actualRow = row % numberItems;
    // ...
}
46
squelart

私はここに私の答えを見つけました:

http://forums.macrumors.com/showthread.php?p=6120638&highlight=UIPickerView#post6120638

行のタイトルを求められたら、次のように指定します。コード:

return [rows objectAtIndex:(row % [rows count])];

ユーザーdidSelectRow:inComponent:と表示されたら、次のようなものを使用します。

コード:

//we want the selection to always be in the SECOND set (so that it looks like it has stuff before and after)
if (row < [rows count] || row >= (2 * [rows count]) ) {
    row = row % [rows count];
    row += [rows count];
    [pickerView selectRow:row inComponent:component animated:NO];
}

UIPickerViewはネイティブでのラップアラウンドをサポートしていないようですが、表示するデータセットをさらに挿入し、ピッカーが停止したときにコンポーネントをデータセットの中央に配置することで、それをだますことができます。

21
David

すべての答えが実際にピッカービューを循環的にスクロールさせるわけではありません。

UIScrollViewに基づいて循環tableViewを作成しました。そして、このtableViewに基づいて、UIPickerViewを再実装します。このDLPickerViewに興味があるかもしれません。また、このピッカービューには、UIPickerViewが持つすべての機能がありますが、多くの新機能もあり、このピッカービューのカスタムははるかに簡単です。

https://github.com/danleechina/DLPickerView

また、このDLPickerView循環スクロールは、実際には循環スクロールであることを認識してください。別のクラスDLTableViewが原因ですべての魔法が起こりました。

0
Dan Lee

配列を複数回作成するだけで、番号を複数回取得できます。 0から23までの数値を取得し、それを配列に入れたい場合を考えてみましょう。このように10回行うと...

NSString *stdStepper;

    for (int j = 0; j<10; j++) {
        for(int i=0; i<24; i++)
        {
            stdStepper = [NSString stringWithFormat:@"%d", i];

            [_hoursArray addObject:stdStepper];

        }
    }

後でこのように選択された行0を設定します

[_hoursPickerView selectRow:120 inComponent:0 animated:NO];
0
user2912794