2013-09-29 2 views
13

В iOS 7 разработчикам рекомендуется отображать подборщики дат между ячейками таблицы, когда это необходимо для ввода, а затем скрыть их при завершении. Как я могу достичь этого эффекта?iOS Показать UIPickerView между UITableViewCells

enter image description here

+1

есть ответ на ваш вопрос здесь: http://stackoverflow.com/questions/17646351/make-uipickerview-appear- между ячейками-когда-touch-cell –

ответ

16

Василикэ Costescu имеет большой учебник по нему здесь: http://masteringios.com/blog/2013/10/31/ios-7-in-line-uidatepicker/

И для статических таблиц: http://masteringios.com/blog/2013/11/18/ios-7-in-line-uidatepicker-part-2/

Пример кода здесь: https://github.com/costescv/InlineDatePicker

Ключевые биты являются скрыть/показать методы:

- (void)showDatePickerCell { 
    self.datePickerIsShowing = YES; 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 

    self.datePicker.hidden = NO; 
    self.datePicker.alpha = 0.0f; 

    [UIView animateWithDuration:0.25 animations:^{ 
     self.datePicker.alpha = 1.0f; 
    }]; 
} 

- (void)hideDatePickerCell { 
    self.datePickerIsShowing = NO; 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 

    [UIView animateWithDuration:0.25 
        animations:^{ 
         self.datePicker.alpha = 0.0f; 
        } 
        completion:^(BOOL finished){ 
         self.datePicker.hidden = YES; 
        }]; 
} 

И этот метод UITableViewDelegate будет «скрыть» строки, установив высоту до 0:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (indexPath.section == 0 && indexPath.row == 4 && self.datePickerIsShowing == NO){ 
     // hide date picker row 
     return 0.0f; 
    } 
    return [super tableView:tableView heightForRowAtIndexPath:indexPath]; 
} 

Вы можете вызывать методы скрыть/показать с помощью кнопки или просто путем выбора строк в таблице. (Примечание. Если в других строках есть текстовые поля, вам может потребоваться скрыть datePicker в методе делегата textFieldDidBeginEditing).

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.section == 0 && indexPath.row == 4) { 
     if (self.datePickerIsShowing){ 
      [self hideDatePickerCell]; 
     }else { 
      [self showDatePickerCell]; 
     } 
    } 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

EDIT: Будьте осторожны при использовании более двух этих встроенных взглядов початкоотделяющем на в одной таблице. Я заметил, что они, как правило, загружаются очень медленно из раскадровки: iOS 7 slow to open UITableViewController with UIPickerView

+0

@Antony F У вас есть опыт работы с этим кодом и несколькими разделами ?! – davidOhara

+0

@chrizstone - Да. В моем примере в строке 4 раздела 0 есть только один дампикер, но вы можете добавить несколько сборщиков дат в разные строки или разделы. –

+0

Я пробовал это, но по какой-то причине иногда неправильный сборщик отображается в неправильном ряду ... – davidOhara

Смежные вопросы