当UISearchBar处于活动状态时,UITableView内容与状态栏重叠

我有一个UITearchBar和UISearchDisplayController的UITableViewController。 它存在于UINavigationController中的UIViewController的Container View中。 我做了这个图像来帮助描述结构:

在这里输入图像说明

这实际上是这样的:

在这里输入图像说明

当我点击search栏时,我必须隐藏导航栏。 通常,这将发生在自己的,但由于我的UITableViewController是在一个容器视图内,我必须自己处理这个变化。 这是它看起来像然后,请注意状态栏是白色的,因为导航栏是白色,即使它是隐藏的时刻。

在这里输入图像说明

一旦我开始input一些search文本,结果就会显示出来。 如果我向上滚动这些结果,它们将通过search栏下方,但是它们重叠的状态栏非常没有吸引力。

在这里输入图像说明

如果没有涉及容器视图,那么这一切都按预期工作,并且表格内容通过状态栏下方,但是涉及到容器视图时,表格文本和状态栏发生冲突。

如何让文本像正常一样在状态栏下传输?

我有search这个小时,我的最终结果是把这一行viewDidLoad: self.extendedLayoutIncludesOpaqueBars = YES;

问题解决了 :)

尝试在TableViewController viewDidLoad中设置definesPresentationContext

迅速

 override func viewDidLoad() { super.viewDidLoad() definesPresentationContext = true } 

Objective-C的

 - (void)viewDidLoad { [super viewDidLoad]; self.definesPresentationContext = YES; } 

以下是对我有用的东西:

做:

  • 使用UISearchController(不是一个单独放置的UISearchBar)
  • 如果你的VC不在UINavigationController中, 如果需要,将导航栏设置为“显示导航栏”。
  • 为UITableView(不是弹簧和支柱)使用自动布局,并将表顶部钉在VC视图的顶部。
  • 添加这个委托方法:

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

别:

  • 摆弄edgesForExtendedLayout
  • 用extendedLayoutIncludesOpaqueBars小提琴
  • 摆弄桌子的contentInset

基本上这是由于导航栏的飘动,通常视图控制器修复重叠,通过更正拥有的视图或子视图的顶部插入,如果他们是(或从UIScrollViewinheritance)。 您有2个选项,一个是将导航栏的透明度设置为no,另一个是将edgeForExtendedLayout设置为none,只剩下底部。

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

如果您在设置这些属性之前在较低的目标检查上进行部署,这些build议仅适用于iOS7。
另一种方法,但我没有testing可以读取--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,但我有类似的问题gapes和其他副作用。 其中之一是UISearchBar之间切换后UISearchBar之间切换UISearchDisplayController是可见的(我使用SWRevealViewController在UIViewController之间切换)之间切换。 这个问题只发生在iPad上。 UISearchBar突然隐藏在UINavigationBar后面。 现在我解决了UITableViewController中显示在UIContainerView中的以下几行代码:

 - (UINavigationController *)navigationController { return nil; } 

这些行防止UISearchDisplayController到达并更改我的UINavigationController。 我也将这个方法分类到“MyContainerTableViewController”类中,并且现在将这个类用于所有embedded的UITableViewController。

我仍然使用UISearchDisplayController来支持iOS 7。

下面的黑客为我工作:

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