Подтвердить что ты не робот

Содержимое UITableView перекрывает строку состояния, когда активен UISearchBar

У меня есть UITableViewController с UISearchBar и UISearchDisplayController. Это существует внутри контейнера View в UIViewController, который находится в UINavigationController. Я сделал это изображение, чтобы помочь описать структуру:

enter image description here

Это выглядит так:

enter image description here

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

enter image description here

Как только я начну вводить текст поиска, результаты появятся. Если я прокручу эти результаты вверх, они проходят под панелью поиска, но они перекрывают строку состояния, которая очень непривлекательна.

enter image description here

Если контейнер Container View не задействован, все это работает по назначению, а содержимое таблицы проходит под Строкой состояния, но с вовлеченным ContainerView столбец таблицы и строка состояния сталкиваются.

Как получить текст для перемещения в строке состояния, как обычно?

4b9b3361

Ответ 1

У меня есть поиск в течение нескольких часов, и мой конечный результат состоял в том, чтобы поместить эту строку в viewDidLoad:   self.extendedLayoutIncludesOpaqueBars = YES;

Проблема решена:)

Ответ 2

Попробуйте установить definesPresentationContext в viewDidLoad вашего TableViewController

Свифта

override func viewDidLoad() {
    super.viewDidLoad()

    definesPresentationContext = true
}

Objective-C

- (void)viewDidLoad {
    [super viewDidLoad];

    self.definesPresentationContext = YES;
}

Ответ 3

Вот что сработало для меня:

DO:

  • Использовать UISearchController (не отдельно размещенный UISearchBar)
  • Поместите свой VC в UINavigationController, если он еще не установлен. Настройте навигацию, если не хотите "Показать панель навигации".
  • Использовать автозапуск для UITableView (не пружин и распорок) и привязать верхнюю часть таблицы к вершине представления VC.
  • Добавьте этот метод делегата:

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }

DO NOT:

  • Fiddle with edgesForExtendedLayout
  • Fiddle with extendedLayoutIncludesOpaqueBars
  • Fiddle with the table contentInset

Ответ 4

В основном это связано с прозрачностью навигационной панели, как правило, с контроллером представления, который перекрывается, путем исправления верхних вложений принадлежащего виду или подзаголовка, если они (или наследуются) от UIScrollView. У вас есть 2 варианта, один - установить прозрачность навигатора на нет, другой - на edgeForExtendedLayout, чтобы ни одна руда не оставила только нижнюю.

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = YES;
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = NO;
}

Эти рекомендации работают только на iOS7, если вы развертываете при более низкой целевой проверке перед настройкой этих свойств.
Другой способ, но я не тестировал, можно прочитать длину --topLayoutGuide, а в - searchDisplayControllerWillBeginSearch попытаться установить topInsets той же длины. Таким образом, вы должны сохранить прозрачность.

Ответ 5

У меня есть UISearchBar и UISearchDisplayController.

В viewdidload:

self.edgesForExtendedLayout = UIRectEdgeNone;
searchDisplayController.searchBar setBackgroundImage:[self imageWithColor:ETSBaseColor] forBarPosition:0 barMetrics:UIBarMetricsDefault];

который получает изображение из UIColor:

- (UIImage *)imageWithColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

Ответ 6

У меня была та же проблема:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
    controller.searchBar.searchBarStyle = UISearchBarStyleDefault; // Used to cover UIStatusBar
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
    controller.searchBar.searchBarStyle = UISearchBarStyleMinimal; // Used not to show top and bottom separator lines
}

Ответ 7

В моем случае я не хочу скрывать UINavigationBar, но у меня были подобные проблемы с разрывами и другими побочными эффектами. Одним из них был отсутствующий UISearchBar после переключения между UIViewControllers, пока отображается UISearchDisplayController (я использую SWRevealViewController для переключения между UIViewController). Эта проблема возникает только на iPad. Вышло, что UISearchBar внезапно скрывается за UINavigationBar. Теперь я решил все свои проблемы со следующими строками кода в UITableViewController, который представлен в UIContainerView:

- (UINavigationController *)navigationController {
    return nil;
}

Эти строки не позволяют UISearchDisplayController достичь и изменить мой UINavigationController. Я также подклассифицировал этот метод в класс "MyContainerTableViewController" и теперь использую этот класс для всех встроенных UITableViewController.

Я все еще использую UISearchDisplayController для поддержки iOS 7.

Ответ 8

Для меня работал следующий хак:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return (self.searchController.isActive  && section == 0) ? 22.0f : 0.0f;
}