Как создать компонент UIPickerView? - PullRequest
40 голосов
/ 18 октября 2008

Я хотел бы показать набор последовательных чисел в компоненте UIPickerView, но сделать так, чтобы он вращался, как компонент секунд приложения Clock-> Timer. Единственное поведение, которое я могу включить, выглядит как компонент часов приложения Timer, в котором вы можете прокручивать только в одном направлении.

Ответы [ 4 ]

46 голосов
/ 15 декабря 2008

Так же просто установить большое количество строк и заставить его начинать с большого значения, есть небольшой шанс, что пользователь когда-либо будет прокручивать колесо в течение очень долгого времени - И даже тогда, хуже всего то, что они достигнут дна.

- (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;
    // ...
}
21 голосов
/ 21 октября 2008

Я нашел свой ответ здесь:

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 не поддерживает внутреннее обтекание, но вы можете обмануть его, вставив дополнительные наборы данных для отображения и, когда сборщик остановится, центрируя компонент в середине набора данных.

0 голосов
/ 14 ноября 2016

Все ответы не заставляют циклически прокручиваться в окне выбора.

Я сделал циклический просмотр таблицы на основе UIScrollView. И на основе этого tableView я повторно реализую UIPickerView. Вы можете быть заинтересованы в этом DLPickerView. И этот вид выбора имеет все функции, которые есть у UIPickerView, но также дает много новых функций, и настраивать этот вид выбора намного проще.

https://github.com/danleechina/DLPickerView

И помните, что эта DLPickerView циклическая прокрутка действительно циклически прокручивается. Вся магия произошла из-за другого класса DLTableView.

0 голосов
/ 25 мая 2015

Просто создайте массив несколько раз, чтобы ваши числа были несколько раз. Скажем, когда нужно иметь числа от 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];
...