IOS 7 TableView в эффекте ViewController и NavigationBar

Я начал создавать TableView в своем приложении с помощью TableViewController в раскадровке. Когда вы это делаете, у вас очень эффектный эффект при прокрутке вниз по списку: ячейки, движущиеся за панель навигации, размываются.

Некоторое время спустя мне пришлось переместиться с этого TableViewController на ViewController с помощью TableView внутри (мне пришлось добавлять другие представления в нижней части таблицы).

Чтобы избежать того, чтобы первые ячейки были скрыты навигационной панелью (над ней), я добавил ограничения на верхние и нижние направляющие макета, а также на левый и правый края представления.

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

Я видел обходные пути, когда люди не использовали ограничений и помещали магические числа в построитель интерфейсов. Я не могу этого сделать, во-первых, потому что мне это не нравится, а во-вторых, потому что я должен быть совместим с iOS 6.

Что я упустил, чтобы снова воспользоваться преимуществами размытого эффекта навигационной панели?

Ответ 1

Вы должны вручную отрегулировать contentInset в представлении таблицы и убедиться, что начало кадра в виде таблицы равно 0, 0. Таким образом, представление таблицы будет находиться ниже панели навигации, но будет некоторое различие между контентом и контурами прокрутки (содержимое будет сдвинуто вниз).

Я советую вам использовать свойство topLayoutGuide контроллера вида для установки правильного contentInsets вместо жесткого кодирования 64 (строка состояния + панель навигации). Там также bottomLayoutGuide, который вы должны использовать в случае UITapBar s.

Вот пример кода (viewDidLoad должно быть хорошо):

// Set edge insets
CGFloat topLayoutGuide = self.topLayoutGuide.length;
tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

Кстати, эти свойства UIViewController могут вам помочь (вам не нужно менять значения по умолчанию, но я не знаю, что такое иерархия вашего представления):

  • automaticallyAdjustsScrollViewInsets
  • edgesForExtendedLayout
  • extendedLayoutIncludesOpaqueBars

Ответ 2

TableView должен быть полноэкранным. Это находится под верхним и нижним стержнем. Примечание. Не используйте верхние и нижние направляющие макета, поскольку они используются для позиционирования относительно баров не под ним.

Затем вам нужно вручную установить вложенный контент в tableview. Это устанавливает начальную позицию прокрутки под верхнюю панель.

Что-то вроде:

CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
CGFloat h=MIN(statusBarSize.width, statusBarSize.height);
UIEdgeInsets e = UIEdgeInsetsMake(self.navigationController.navigationBar.bounds.size.height + h,
                                             0.0f,
                                             0.0f,
                                             0.0f);

self.tableView.contentInset = e;

Вы не получаете эту функцию бесплатно при использовании контроллера tableView и настроек "Автоматическая настройка содержимого"

Ответ 3

Свойство UIViewController edgesForExtendedLayout делает трюк. Если вы используете раскадровки, убедитесь, что Extended Edges Under Top Bars включен (и он по умолчанию). Если вы создаете свой контроллер просмотра программным способом, попробуйте следующее:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.edgesForExtendedLayout = UIRectEdgeAll;
}

И, конечно же, в вашем представлении таблицы должны быть правильные автоматические маскировки/макеты ограничений

Ответ 4

Вероятно, координаты вашего tableView не установлены на (0, 0) для сопоставления с координатами viewController.view.frame или viewController.view.bounds. Если вы это сделали, попробуйте установить

self.navigationController.navigationBar.translucent = YES;

Ответ 5

edgeForExtendedLayout здесь не то, что вам нужно, так как это ограничит представление таблицы под панелью навигации. В iOS 7 контроллеры представлений по умолчанию используют полноэкранный режим, а свойство, управляющее тем, где начинается контент tableview, автоматически настраиваетсяScrollViewInsets. Это должно быть ДА по умолчанию, поэтому проверьте, установлено ли оно каким-либо образом НЕТ или попробуйте установить его явно.

Отметьте этот ответ для хорошего объяснения того, как это работает: fooobar.com/info/23534/...