UIPickerView бесконечные строки - PullRequest
       3

UIPickerView бесконечные строки

5 голосов
/ 01 сентября 2010

Как видно в UIDatePicker, вы можете прокручивать бесконечно вверх (а также вниз). Я тоже хочу это сделать, потому что я хочу, чтобы люди выбирали дату, такую ​​как:

1 января 2010 г. 2 января 2010 г. ... 30 декабря 2010 г. 31 декабря 2010 г. 1 января 2011 ..

Так что это может продолжаться вечно. Как бы я это сделал? Поскольку я могу дать только определенное количество строк в делегате.

Ответы [ 5 ]

8 голосов
/ 01 сентября 2010

Я не думаю, что вы на самом деле можете сделать цикл UIPickerView, но способ, которым я делал это в прошлом, это вернуть действительно большое число из numberOfRowsInComponent, а затем вычислить модуль строки, чтобы вернуть соответствующийвид из viewForRow, например:

// picker data source:
-(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger) component
{
    // to make it look like the picker is looping indefinetly,
    // we give it a really large length, and then in the picker delegate we consider
    // the row % (actual length) instead of just the row.
    return INT16_MAX;
}


// picker delegate:
-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger) row forComponent:(NSInteger) component reusingView:(UIView *)view
{
    // to make it look like the picker is looping indefinetly,
    // we give it a really large length in the picker data source, and then we consider
    // the row % actual_length instead of just the row.
    row = row % actual_length;
    // where actual length is the number of options that will be looping

    // ... do whatever
}

и в вашей инициализации:

- (void)viewDidLoad {
    [super viewDidLoad];

    // ... whatever other initialization... 

    // to make it look like the picker is looping indefinetly ,
    // we give it a really large length in the picker data source, and then we consider
    // the row % actual_length instead of just the row, 
    // and we start with the selection right in the middle, rounded to the
    // first multiple of actual_length so we start the selection on 
    // the first option in the list.
    [myPicker selectRow:(INT16_MAX/(2*actual_length))*actual_length inComponent:0 animated:NO];
}
4 голосов
/ 16 февраля 2013

Я согласен с большинством из приведенного выше (филиппинского) ответа, только одно: да, вы можете сделать цикл UIPickerView:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    [myPicker selectRow:(INT16_MAX/(2*actual_length))*actual_length inComponent:0 animated:NO];
}

-(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger) component
{
    return INT16_MAX; // Just some big number
}

-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger) row forComponent:(NSInteger) component reusingView:(UIView *)view
{
row = row % actual_length; // This is the value you should use as index of your data

// And here comes the trick, move the wheel back again to the middle rows
// so the user can virtually loop in any direction
pickerView selectRow:(row + (INT16_MAX/(2*actual_length))*actual_length)  inComponent:component animated:NO];
}

Все приведенные выше ответы, и этот практически одинаковычто LivingTech объясняет, но с кодом.И ответ Филипе тоже правильный, но если вы хотите более строгий ответ, просто вернитесь в соответствующий средний ряд, когда пользователь прекратит прокрутку.В любом случае, это не дает никаких практических преимуществ, потому что пользователь устает быстрее, чем прокручивает INT16_MAX / 2 раза.

2 голосов
/ 01 сентября 2010

Высокий уровень: укажите конечное количество строк в вашем делегате.Затем определите, когда вы доберетесь до верха или низа этих строк, и измените делегат, чтобы строка находилась посередине (или сверху, или как угодно).Очевидно, что вам нужно изменить местоположение таблицы, используя один из методов прокрутки (предположительно без анимации, поэтому это происходит без ведома пользователя).

Имеет смысл?Я никогда этого не делал, но это должно быть теоретически возможно.

1 голос
/ 02 апреля 2015

На основе приведенных выше ответов я создал новый компонент (GWInfinitePickerView), который делает UIPickerView «бесконечным» (конечно, у него есть конец, но чтобы его достичь, нужно прокрутить пару минут).Чтобы изменить поведение UIPickerView, вам нужно всего лишь изменить его класс.Код и демо вы можете найти на github (https://github.com/gwikiera/GWInfinitePickerView), или вы можете просто установить его с помощью cocoapods.

1 голос
/ 22 апреля 2011

Попробуйте этот компонент: http://dev.doukasd.com/2011/04/infinite-scrolling-dial-control-for-ios/

Это должно быть так же просто, как создать 2 DialControllers и установить нужные значения. Приведенный пример очень похож.

...