2013-11-28 4 views
1

У меня есть контроллер табличного представления, а я drag-and-drop an additional UIView on a storyboard to make a header, он становится подпунктом UITableView.Работа с пользовательскими подпроектами UITableView

Я не делают это «официальный» заголовок раздела с viewForHeaderInSection: и друзьями (я объясню, почему), это просто подтаблицы представления таблицы, которая появляется в верхней части таблицы, наряду с внутренним табличном обертки и обновления в иерархии представлений.

Иерархия выглядит следующим образом:

UITableView 0,0 320x455 
    UIRefreshControl 0,0 320x60 
    UITableViewWrapperView 0,0 320x455 
    cell 0,190 320x44 
    cell 0,146 320x44 
    cell 0,102 320x44 
    cell 0, 58 320x44 
    custom UIView 0,0 320x58 

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

Проблема в том, что у меня мало контроля над укладкой ячеек. При изменении размера пользовательского вида (путем изменения его фрейма) он накладывает вид на оболочку таблицы.

Итак, почему бы мне просто не сделать это в виде заголовка раздела и изменить его размер через heightForHeaderInSection:? Проблема заключается в том, что когда текстовое поле сфокусировано или набирается, мне нужно позвонить [self.tableView reloadData], чтобы обновить данные в таблице (тип поиска по типу), который также перезагружает заголовки и заставляет текстовое поле терять фокус ,

Так, чтобы подвести итог,

  1. Как я на самом деле сделать заголовок таблицы, который может динамически изменять размер и толкать вниз ячейки таблицы?
  2. Как сохранить фокус текстового вида внутри заголовка таблицы при перезагрузке указанной таблицы?
+0

Как пробовать это так - дайте вашей таблице две секции, причем первая секция имеет только одну ячейку, эта ячейка будет вашим «заголовком». Когда вам нужно перезагрузить, используйте reloadSections: только для перезагрузки раздела 1, поэтому ваш «заголовок» не будет перезагружен. – rdelmar

+0

@rdelmar Я развлекал эту идею. * Еще одна вещь, о которой я не упоминал, это то, что у меня есть класс базового контроллера, который используется другими подобными представлениями, мне пришлось бы реорганизовать его для представления таблицы из 2 разделов, поэтому я избегал этого. –

+0

@rdelmar Я просто понял, что это не сработает, потому что мне нужно перезагрузить верхнюю секцию для изменения высоты заголовка, что, конечно же, приведет к разрушению UITextField focus ... –

ответ

1

Раствор с tableHeaderView (не связанный с видом заголовка раздела):

  1. Назначение перетаскивается вид (или любой вид), чтобы self.tableView.tableHeaderView.
  2. Если вы хотите изменить его, change its frame and assign it again.
  3. Представление будет перерисовываться с новой высотой, но текстовое поле будет держать фокус.
+0

Я заметил, что вам не нужно делать это первоначальное назначение, если вы перетащите представление в представление таблицы в IB - он запишет self.tableView.tableHeaderView, вы увидите, что перетаскиваемый вид автоматически является заголовком таблицы Посмотреть. Вы также можете анимировать расширение заголовка с помощью NSTimer, если хотите, назначив его снова после каждого изменения высоты. – rdelmar

0

Я также обнаружил, что вам нужно переназначить представление заголовка для свойства tableHeaderView таблицы table, чтобы он мог правильно расширяться. Затем я попытался выяснить, как оживить этот эффект. Я мог бы сделать это с помощью NSTimer, сбросив свойство tableHeaderView табличного представления после каждого возрастающего увеличения размера, но это выглядело немного отрывистым. Попытка оживить его в блоке анимации привела к нескольким странным эффектам - если бы я изменил высоту (и переназначил свойство tableHeaderView) в блоке анимации, он работал нормально при увеличении небольшого размера, но более крупные вызывали некоторые из ячеек исчезают в нижней части экрана при запуске анимации (хотя в конце анимации все было хорошо). В конце концов, я обнаружил, что изменение высоты самого представления таблицы и изменение его обратно до его первоначального размера в блоке завершения, а также изменение размера заголовка (снова) в блоке завершения заставили все работать.

-(void)growHeaderBy:(NSInteger) delta { 
    [UIView animateWithDuration:.6 animations:^{ 
     self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.tableView.frame.size.height + delta); 
     self.header.frame = CGRectMake(self.headerFrame.origin.x, self.headerFrame.origin.y, self.headerFrame.size.width, self.headerFrame.size.height + delta); 
     self.tableView.tableHeaderView = self.header; 
    } completion:^(BOOL finished) { 
     self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, self.tableView.frame.size.height - delta); 
     self.header.frame = CGRectMake(self.headerFrame.origin.x, self.headerFrame.origin.y, self.headerFrame.size.width, self.headerFrame.size.height + delta); 
     self.tableView.tableHeaderView = self.header; 
    }]; 
} 

headerFrame - это свойство, установленное на исходный фрейм заголовка в viewDidLoad.

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