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

时间:2014-04-17 04:50:42

标签: ios uitableview uisearchbar uisearchdisplaycontroller uicontainerview

我有一个带UISearchBar和UISearchDisplayController的UITableViewController。它存在于UIVavigationController中的UIViewController中的Container视图中。我制作了这张图片来帮助描述结构:

enter image description here

这就是它的真实情况:

enter image description here

当我点按搜索栏时,我必须隐藏导航栏。通常,这会自行发生,但由于我的UITableViewController在Container View中,我必须自己处理这个更改。这就是它的样子,注意状态栏是白色的,因为导航栏是白色的,即使它现在是隐藏的。

enter image description here

一旦我开始输入一些搜索文本,结果就会显示出来。如果我向上滚动这些结果,它们会在搜索栏下方传递,但它们与状态栏重叠,这非常没有吸引力。

enter image description here

如果没有涉及容器视图,那么这一切都按预期工作,并且表内容在状态栏下面传递,但是涉及到ContainerView时,表文本和状态栏会发生碰撞。

如何让状态栏下的文字正常运行?

8 个答案:

答案 0 :(得分:35)

我已经搜索了几个小时,我的最终结果是将这一行放在viewDidLoad中:     self.extendedLayoutIncludesOpaqueBars = YES;

问题解决了:))

答案 1 :(得分:5)

尝试设置definesPresentationContext

viewDidLoad中的TableViewController

夫特

override func viewDidLoad() {
    super.viewDidLoad()

    definesPresentationContext = true
}

目标-C

- (void)viewDidLoad {
    [super viewDidLoad];

    self.definesPresentationContext = YES;
}

答案 2 :(得分:4)

这对我有用:

DO:

  • 使用UISearchController(不是单独放置的UISearchBar)
  • 将VC放在UINavigationController中(如果尚未安装)。如果需要,将导航设置为“显示导航栏”。
  • 对UITableView使用autolayout(不是弹簧和支柱),并将表格顶部固定在VC视图的顶部。
  • 添加此委托方法:

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

DO NOT:

  • 摆弄edgeForExtendedLayout
  • 使用extendedLayoutIncludesOpaqueBars
  • 摆弄表格的contentInset

答案 3 :(得分:3)

我有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;
}

答案 4 :(得分:2)

基本上这是由于导航栏的交互性,通常是视图控制器修复重叠,通过更正拥有的视图或子视图的顶部插入(如果它们是(或继承)来自UIScrollView)。您有两个选项,一个是将导航栏的traslucency设置为no,另一个是将edgeForExtendedLayout设置为none,只留下底部。

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

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

如果您在设置这些属性之前部署较低目标检查,则这些建议仅适用于iOS7 另一种方法,但我没有测试可以读取--topLayoutGuide长度,并在 - searchDisplayControllerWillBeginSearch尝试设置相同长度的topInsets。这样你就应该保持半透明度。

答案 5 :(得分:0)

我遇到了同样的问题:

- (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
}

答案 6 :(得分:0)

在我的情况下,我不想隐藏UINavigationBar,但我有类似的问题与gapes和其他副作用。其中一个是UIVearchBar之间切换后丢失的UISearchBar,而UISearchDisplayController是可见的(我正在使用SWRevealViewController在UIViewController之间切换)。仅在iPad上出现此问题。结果是UISearchBar突然隐藏在UINavigationBar后面。现在我用UITontainerView中呈现的UITableViewController中的以下代码行解决了所有问题:

- (UINavigationController *)navigationController {
    return nil;
}

这些行阻止UISearchDisplayController到达并更改我的UINavigationController。我还将此方法子类化为“MyContainerTableViewController”类,并将此类用于所有嵌入式UITableViewController。

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

答案 7 :(得分:0)

以下黑客为我工作:

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