iOS 7 - 带搜索的UITableViewController在状态栏下方

14

我有一个带有嵌入式UISearchDisplayController的UITableViewController。在iOS 7中,搜索框位于状态栏下方。是否可以使用interface builder来偏移tableview,以使搜索栏不被状态栏遮盖,并且仍然使用UITableViewController和UISearchDisplayController设置)?


在Storyboard中,您是否尝试将视图控制器的“状态栏”更改为“无”? - Sam B
1
在应用程序运行时,在模拟指标中将状态栏设置为“无”不会产生任何效果。 - datinc
9个回答

14
self.edgesForExtendedLayout=UIRectEdgeNone;

应该解决这个问题。


1
如果您的UITableView显示在导航栏下方,则可以使用此方法解决。 - Jesse
但现在我也遇到了一个问题,即uitableview正在扩展到底部选项卡栏以下。你会如何解决这个问题?是的,我可以将高度设置为在选项卡栏上方结束,但这样在iOS 6上看起来不正确。 - Jesse
你可以使用[[UIScreen mainScreen] bounds]来获取屏幕高度,然后调整UITableView的大小。 - Filippo

7
你需要将其嵌入到UINavigationController中,然后在navVC中,只需取消勾选Shows Navigation Bar即可。 enter image description here

1
这个组合使用 @Filippo 的代码(即在 -viewDidLoad 中设置 self.edgesForExtendedLayout=UIRectEdgeNone;)最终对我起了作用。 - Fang Chen
你确定吗?如果不使用那一行,会发生什么? - Kyle Fang

4
这种方法有些不太正规,但是它对我有效:
[self.tableView setContentInset:UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height + [[UIApplication sharedApplication] statusBarFrame].size.height, 0, 0, 0)];

如果您需要同时适配两种屏幕方向:

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
 [self.tableView setContentInset:UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height + [[UIApplication sharedApplication] statusBarFrame].size.height, 0, 0, 0)];

}


这对我没有用。您能解释一下在tableview上设置内容插入如何更改UISearchDisplayController的UISearchBar框架吗? - Fang Chen

2
self.edgesForExtendedLayout = UIRectEdgeNone;
...
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    if (navigation.hiden) {
        [self.tbview setContentOffset:CGPointMake(0, -20)];
        [self.tbview setContentInset:UIEdgeInsetsMake(20, 0, 0, 0)];
    }
    else {
        [self.tbview setContentOffset:CGPointMake(0, -20)];
        [self.tbview setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    }
}

2

我需要调整tableview的contentOffsetcontentInset。我的tableviewcontroller是由模态segue触发的,已经在storyboard中上游嵌入了一个导航控制器。通过将内容插图调整为状态栏的高度,并将内容偏移调整为搜索栏的高度,可以显示从第一行开始的tableview。当用户下拉tableview时,搜索栏会显示。

self.tableView.contentOffset = CGPointMake(0, 44.0);
self.tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0);

2

将以下代码放置在您的视图控制器的viewdidload中。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;
        self.automaticallyAdjustsScrollViewInsets = NO;
}

1
在iOS 6/7中,当数据加载到表视图中后,只需调用以下代码:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

但请确保搜索栏已添加为表视图的标题。

1
我找到了罪魁祸首。将布局选项“调整滚动视图插入”设置为开启即可解决问题。

1
  1. 你指的是哪个“布局选项”?
  2. 我找不到“调整滚动视图插图”的位置,你能指给我看吗?
谢谢你的帮助。
- Fang Chen
您可以在此图片中看到该选项!链接 - datinc
这只影响我在tabbarcontroller中设置的一个视图。该选项已经打开,但没有效果。 - Hackmodford

1
你所需要做的就是选择包含UITableView的视图控制器并显示属性检查器。在属性检查器中,取消选中“扩展边缘 -> 在顶部栏下和在底部栏下”。当我的UITableview在导航栏和标签栏下面加载时,这对我有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接