如何使我的iOS7 UITableViewController不出现在顶部的状态栏下?

我的根控制器是一个TabBarController(选项卡式应用程序)。 其中一个选项卡是UITableViewController。 当我切换到并滚动项目,他们出现在顶部的状态栏(信号,电池等)。 我不要那个。 我希望这是不透明的或…什么。 这与表格单元格的文本在视觉上震撼,这是状态的东西。

我可以从我的故事板修复这一些属性设置,我不明白? 或者我需要添加一些方法到我的子类? 或者,也许我需要包装我的UITableViewController与其他types的控制器?

我已经尝试了Storyboard属性页面中的ViewController Layout和Extend Edges设置的许多变体,但没有一个似乎改变了它。

更新 :我认为我的问题是非常类似于iOS 7:UITableView显示在状态栏下 。 唯一的区别是,我embedded在TabBarController,这种情况是作为根视图。 我尝试了在那里embedded一个NavigationController和设置Show Navigation BarFalse的解决scheme,但没有任何区别。

屏幕截图

我的故事板(缩小)显示一个标签控制器,有2个孩子,一个单一的视图,而另一个表视图。

故事板

标签栏控制器的设置

标签栏控制器设置

表视图控制器的设置

表格视图控制器设置

应用程序最终看起来像在我的手机上

在这里输入图像说明

故事如何结束

尽pipe下面有很多答案,但没有一个真的有效。 某种有点,但不是真的。 我也尝试了embedded在NavigationController方法,也有问题。 什么工作虽然,是这样的:

  1. 添加UIViewController
  2. 设置子控制器的关系和标签栏控制器(就像我已经有的其他两个)
  3. 添加一个TableView(不是控制器)到新的UIViewController,根据需要定位,它将捕捉到状态栏的底部
  4. 将TableView的delegatetableSource为新的控制器
  5. 创build一个自定义的UIViewController子类并更新故事板中控制器的类types
  6. 将我自定义的UITableViewController子类中的表相关方法复制到我的新子类中
  7. 从原始select我的原型表单元格,并命令+拖动到新的表格视图
  8. 愉快地删除原来的TableViewController(和包装器NavigationController)
  9. 更新标签栏项目以匹配以前
  10. 为另一个“你正在努力”

试试这个viewDidLoad:

 self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0); 

20 px是状态栏的高度。 如果您有一个导航栏使用64而不是20

如果有人还在读这个主题:

什么对我来说也是取消选中父标签栏控制器中的“扩展边缘”选项。 这在iOS7和iOS6中给出了一致的行为。

使用SWRevealController时遇到同样的问题。

使用上面和下面的评论,我可以通过把它放在工作

 -(void)viewWillAppear instead of ViewDidLoad self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0); 

你有没有尝试像这样添加到视图控制器的viewWillAppear方法:

  if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { self.edgesForExtendedLayout = UIRectEdgeNone; } 

我添加了以下来查看viewWillAppear

 self.tableView.contentInset = UIEdgeInsetsMake(22, 0, 0, 0); 

你也可以通过Storyboard解决这个问题。

从项目大纲(编辑器左侧)select表视图,然后转到属性(右侧)>大小检查器选项卡>滚动视图>内容插入>顶部

看起来你只是想让NavBar不透明,你可以尝试使用

 [self.navigationController.navigationBar setTranslucent:NO]; 

如果有人错过了(现在很长)问题末尾的故事结局部分,简短的回答是:如果你想达到既定的目标, 使用一个带有TableView的简单UIViewController ,而不是TableViewController。

我遇到了同样的问题,并为我工作的解决scheme是添加节标题视图:

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 

然后我在头上添加了20个文本的origin.y。

然后我改变了标题的高度,用原来的高度加20

 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return myHeight+20; } 

对我来说一个简单的解决scheme是(代码是在C#这是因为似乎无效)…

  1. 只需在UITableViewController构造函数中创build一个新的UIView(设置TableView的相同维度)。

  2. 将TableView添加到新创build的视图。

  3. 将新创build的视图设置为UITableViewController的视图属性…

在UITableViewController的构造函数

 var view = new UIView (); view.Frame = this.TableView.Frame; view.AddSubview (this.TableView); this.View = view; 

截至iOS 8.4,我没有得到其他答案中列出的各种故事板选项的任何地方。

我解决了这个问题,而不使用任何维度常量,通过在我的选项卡控制器中放置常规视图,然后用“容器视图”填充,然后通过“embedded”segue连接到我的UITableViewController。

我的performance在尊重我的导航栏和底部的标签栏。

假设你的表的@IBOutlet是

  @IBOutlet var tableView: UITableView! 

创build一个函数prepareTable()。 将下面的行添加到该方法中

 tableView.contentInset.top = UIApplication.shared.statusBarFrame.height 

从ViewDidLoad()调用此方法

假设您的大纲视图或故事板是一个当前具有表视图控制器的选项卡栏控制器。 运行应用程序时,表格视图单元格在状态栏下运行,似乎具有透明背景。 这太糟糕了!

如果你花了几个小时尝试一切,你可以findStackOverflow无济于事,觉得也许是时候考虑新的职业,并准备拨打1-800-LUV-TRUK或1-800-SHT-KIKR,给自己轻轻一拍,在这样的时候打开你喝的任何药水,因为这不是你的错。 真。 特拉维斯是绝对正确的,在这种情况下,在IB中viewDillLoad,viewWillAppear或viewDidAppear或buttonselect/取消select的代码量不会有帮助。

上面的Travis的解决scheme肯定会奏效,但是有点长,有代码的复制和粘贴,我有一个短暂的关注范围,这样Bugs Bunny的一集感觉就像一个完整的电影给我,所以我只知道我会搞砸任何复杂的东西。 但是,嘿,你的里程可能会变化。 安美居…

在运行iOS 9的应用程序的Xcode 7.3(我假设7和8,但我不知道这是确定的,目前我懒得检查)有一个更简单的方法,不需要一个编写任何代码。 它在Xcode的Interface Builder中完成了。

警告: 如果有任何条款不准确,请让我知道我错了,我会纠正任何错误标签。

  1. 转到Interface Builder的Utilities区域并从库窗格中selectObject库。

  2. select一个导航视图控制器对象,并将其拖入您的故事板场景。 您会注意到拖动时会出现两个场景项 – 这些是导航控制器场景和表视图控制器场景。

  3. 删除与导航控制器场景一起出现的重复表格视图控制器场景。

  4. select您的标签栏控制器和您的表视图控制器之间的关系连接,然后点击“删除”。

  5. 按照您想要的故事板中的方式重新定位导航控制器和表格视图控制器。

  6. 从选项卡栏控制器场景拖动到导航控制器场景,然后select“关系区分,视图控制器”。

  7. 从导航控制器场景控制拖动到您的表视图控制器场景,然后select“关系Segue,根视图控制器”。

  8. 最后,在实用程序的对象库中,将一个导航项目对象拖到您的表视图控制器场景的表视图中。

现在,当您运行应用程序时,您将拥有一个导航栏,并且您的表格视图单元格将不再显示在透明状态栏下。

希望这可以帮助。