Pergunta

Eu gostaria de mostrar um conjunto de números consecutivos em um componente UIPickerView mas tê-lo envolver em torno de como o componente de segundos da aplicação Clock-> Contador. O único comportamento que pode permitir que se parece com o horas componente do aplicativo Timer, onde você pode rolar em apenas uma direção.

Foi útil?

Solução

É tão fácil de definir o número de linhas a um grande número, e torná-lo começar em um valor alto, há pouca chance de que o usuário nunca vai rolar a roda para um tempo muito longo - E mesmo assim, o pior que vai acontecer é que eles vão bater no fundo.

- (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;
    // ...
}

Outras dicas

Eu encontrei a minha resposta aqui:

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

Quando se pede o título de uma linha, dar-lhe: Código:

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

Quando se diz que o usuário didSelectRow: inComponent :, uso algo como isto:

Código:

//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];
}

Parece que o UIPickerView não suporta envolvendo em torno de forma nativa, mas você pode enganá-lo através da inserção de mais conjuntos de dados a serem exibidos e quando o selecionador pára, centrando o componente para o meio do conjunto de dados.

Apenas criar uma matriz várias vezes, de modo que você tem seus números várias vezes. Vamos dizer que quando quer ter os números de 0 a 23 e colocar isso em uma matriz. que faremos 10 vezes como este ...

NSString *stdStepper;

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

            [_hoursArray addObject:stdStepper];

        }
    }

depois, definir a linha 0 selecionada como este

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

Todas as respostas não estão realmente fazendo vista selecionador de rolagem ciclicamente.

Eu fiz uma tableView cíclica baseada em UIScrollView. E com base nesta tableView, eu re-implementar UIPickerView. Você pode estar interessado neste DLPickerView. E esta visão selecionador tem todas as características que UIPickerView tem, mas também dá muitos recursos novos e personalizado este ponto de vista selecionador é muito mais fácil.

https://github.com/danleechina/DLPickerView

E estar ciente de que este DLPickerView ciclicamente rolagem é realmente rolagem ciclicamente. Toda a magia aconteceu por causa de outra DLTableView classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top