Ответ 1
У меня есть поиск в течение нескольких часов, и мой конечный результат состоял в том, чтобы поместить эту строку в viewDidLoad: self.extendedLayoutIncludesOpaqueBars = YES;
Проблема решена:)
У меня есть UITableViewController с UISearchBar и UISearchDisplayController. Это существует внутри контейнера View в UIViewController, который находится в UINavigationController. Я сделал это изображение, чтобы помочь описать структуру:
Это выглядит так:
Когда я нажимаю строку поиска, мне нужно скрыть панель Nav. Обычно это происходит само по себе, но поскольку мой UITableViewController находится внутри контейнера, я должен сам это изменить. Вот как это выглядит тогда, обратите внимание, что строка состояния белая, потому что панель навигации белого цвета, хотя в данный момент она скрыта.
Как только я начну вводить текст поиска, результаты появятся. Если я прокручу эти результаты вверх, они проходят под панелью поиска, но они перекрывают строку состояния, которая очень непривлекательна.
Если контейнер Container View не задействован, все это работает по назначению, а содержимое таблицы проходит под Строкой состояния, но с вовлеченным ContainerView столбец таблицы и строка состояния сталкиваются.
Как получить текст для перемещения в строке состояния, как обычно?
У меня есть поиск в течение нескольких часов, и мой конечный результат состоял в том, чтобы поместить эту строку в viewDidLoad: self.extendedLayoutIncludesOpaqueBars = YES;
Проблема решена:)
Попробуйте установить definesPresentationContext
в viewDidLoad
вашего TableViewController
Свифта
override func viewDidLoad() {
super.viewDidLoad()
definesPresentationContext = true
}
Objective-C
- (void)viewDidLoad {
[super viewDidLoad];
self.definesPresentationContext = YES;
}
Вот что сработало для меня:
DO:
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
DO NOT:
В основном это связано с прозрачностью навигационной панели, как правило, с контроллером представления, который перекрывается, путем исправления верхних вложений принадлежащего виду или подзаголовка, если они (или наследуются) от 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 той же длины. Таким образом, вы должны сохранить прозрачность.
У меня есть 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;
}
У меня была та же проблема:
- (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
}
В моем случае я не хочу скрывать UINavigationBar, но у меня были подобные проблемы с разрывами и другими побочными эффектами. Одним из них был отсутствующий UISearchBar после переключения между UIViewControllers, пока отображается UISearchDisplayController (я использую SWRevealViewController для переключения между UIViewController). Эта проблема возникает только на iPad. Вышло, что UISearchBar внезапно скрывается за UINavigationBar. Теперь я решил все свои проблемы со следующими строками кода в UITableViewController, который представлен в UIContainerView:
- (UINavigationController *)navigationController {
return nil;
}
Эти строки не позволяют UISearchDisplayController достичь и изменить мой UINavigationController. Я также подклассифицировал этот метод в класс "MyContainerTableViewController" и теперь использую этот класс для всех встроенных UITableViewController.
Я все еще использую UISearchDisplayController для поддержки iOS 7.
Для меня работал следующий хак:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return (self.searchController.isActive && section == 0) ? 22.0f : 0.0f;
}