Сборка мусора на столе Temp

Предыдущие решения на этой странице дали мне некоторые проблемы, когда мне это нужно, чтобы работать вместе с заголовками разделов и индексной панелью, поэтому я придумал следующую альтернативу. Пожалуйста, обратите внимание; Я не использую автозапуск в своем проекте, и я тестировал это только на iOS9 +;

В раскадровке вашего проекта:

  1. Создайте UITableView в UIViewController (или попробуйте это с UITableViewController).
  2. Отбросить UIView вверху (но внутри) UITableView, поэтому он становится заголовком таблицы над первой ячейкой.
  3. Дайте этому заголовку вид желаемого height (например, 200px) и установите цвет фона на «Очистить цвет». Clear Color важна, представление должно быть прозрачным.
  4. Отбросить второй UIView в заголовке таблицы UIView и сделать его того же размера, что и родительский.
  5. Подключите этот второй UIView к вашему UIViewController IBOutlet, я назвал его «headerView» в моем случае.

Затем перейдите к вашему UIViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Remove view from table header and place it in the background instead.
    [self.headerView removeFromSuperview];
    UIView *backgroundView = [UIView new];
    [backgroundView addSubview:self.headerView];
    self.tableView.backgroundView = backgroundView;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    /* Set initialScrollOffset ivar to start offset, because in my case
       the scroll offset was affected by the statusbar + navigation bar heights
       and the view controller's "extend edges under top bars" option. */
    initialScrollOffset = self.tableView.contentOffset.y;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    /* Modify headerView height only if the table content gets pulled
       beyond initial offset. */
    if (scrollView.contentOffset.y < initialScrollOffset) {
        CGRect frame = self.headerView.frame;
        frame.size.height = self.tableView.tableHeaderView.frame.size.height + -scrollView.contentOffset.y;
        self.headerView.frame = frame;
    }
}

Мне понадобилась эта реализация только для заголовка растяжения с цветом фона и метками. В этом заголовке должно быть легко добавить UIImageView.

Кроме того, шаги с 1 по 5, конечно, полностью необязательны. Вы можете программно создать представление заголовка или вместо него использовать XIB. До тех пор, пока вы убедитесь, что таблица имеет вид с четким цветным заголовком с той же высотой, что и ваш желаемый заголовок, потому что это служит в качестве разделителя, чтобы сохранить ваши ячейки и заголовки разделов в строке.

EDIT:

Я нашел еще более чистый способ выполнить это:

  1. Создайте заголовок таблицы в построителе интерфейса, как описано выше: 1 UIView как контейнер со вторым встроенным UIView.
  2. Пропустить код viewDidLoad выше, нет необходимости вытаскивать UIView из его контейнера, и нам не нужно будет устанавливать его в качестве фона таблицы.
  3. Измените scrollViewDidScroll: к этому:

UIViewController.m:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
      if (scrollView.contentOffset.y < initialScrollOffset) {
           CGRect frame = self.headerView.frame;
           frame.size.height = self.tableView.tableHeaderView.frame.size.height - scrollView.contentOffset.y;
           frame.origin.y = self.tableView.tableHeaderView.frame.origin.y + scrollView.contentOffset.y;
           self.headerView.frame = frame;
    }
}

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

0
задан Jeff 25 June 2012 в 21:49
поделиться