如何让iOS7 UITableViewController不显示在顶部状态栏下?

时间:2013-12-19 16:41:30

标签: ios objective-c layout ios7 uitableview

我的根控制器是一个TabBarController(选项卡式应用程序)。其中一个选项卡是UITableViewController。当我切换到那个并滚动项目时,它们会显示在顶部的状态栏下(信号,电池等)。我不希望这样。我希望那是不透明的......或者某种东西。它在视觉上会震动,表格单元格的文字处于状态填充状态。

我可以通过一些我不理解的属性设置从故事板中解决这个问题吗?或者我需要在子类中添加一些方法吗?或者我可能需要用其他类型的控制器包装我的UITableViewController?

我在Storyboard属性页面中尝试了ViewController Layout和Extend Edges设置的多种变体,但它们似乎都没有更好地改变它。

更新:我认为我的问题与iOS 7: UITableView shows under status bar非常相似。唯一的区别是,我嵌入了TabBarController,这种情况是根视图。我尝试了嵌入NavigationController并将Show Navigation Bar设置为False的解决方案,但它没有任何区别。

屏幕截图

我的故事板(收缩)显示一个标签式控制器,有两个孩子,一个单一视图,另一个是表格视图。

Storyboard

标签栏控制器的设置

tab bar controller settings

表格视图控制器的设置

table view controller settings

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

enter image description here

故事的结局

尽管下面有很多答案,但它们都没有真正起作用。某种程度的,但不是真的。我也尝试了 Embed in NavigationController 方法,这也有问题。虽然有效,但是:

  1. 添加UIViewController
  2. 设置子控制器与它的关系和标签栏控制器(就像我已经拥有的其他两个)
  3. 将一个TableView(非控制器)添加到新的UIViewController,根据需要定位,它将捕捉到状态栏的底部
  4. 将TableView的delegatetableSource设置为新控制器
  5. 创建自定义UIViewController子类并更新故事板中控制器的类类型
  6. 将表格相关的方法从我的自定义UITableViewController子类复制到我的新子类<​​/ li>
  7. 从原始文件中选择我的原型表格单元格,然后命令+将其拖动到新的表格视图
  8. 很高兴删除原来的TableViewController(和包装器NavigationController)
  9. 更新标签栏项目以匹配之前的
  10. 另外一个因为“你正在努力”而

13 个答案:

答案 0 :(得分:33)

在viewDidLoad中尝试:

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

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

答案 1 :(得分:15)

如果有人还在读这个帖子:

对我来说有用的是取消选中&#34; Extend Edges&#34;父标签栏控制器中的选项。这在iOS7和iOS6中提供了一致的行为。

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:4)

您是否尝试过将类似内容添加到视图控制器的viewWillAppear方法:

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

我将以下内容添加到viewWillAppear

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

答案 6 :(得分:2)

您也可以通过Storyboard解决此问题。

从Project Outline(编辑器左侧)中选择Table View,然后转到Properties(右侧)&gt;尺寸检查器标签&gt;滚动视图&gt;内容插入&gt;顶

答案 7 :(得分:1)

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

[self.navigationController.navigationBar setTranslucent:NO];

答案 8 :(得分:1)

我遇到了同样的问题,对我有用的解决方案是添加节标题视图:

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

然后我在标题的原文上添加了20.

然后我通过使用

将20加到原始高度来更改标题高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return myHeight+20;
}

答案 9 :(得分:1)

对我来说,一个简单的解决方案是(代码在C#中,因为似乎无效)...

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

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

  3. 将新创建的视图设置为UITableViewController的View属性...

  4. 在UITableViewController的构造函数

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

答案 10 :(得分:1)

从iOS 8.4开始,我无法通过其他答案中列出的各种故事板选项获得。

我通过在我的标签控制器中放置一个常规视图,然后用一个&#34;容器视图&#34;填充它来解决这个问题而不采用任何维度常量。然后我用&#34; embed&#34;连接到我的UITableViewController。 SEGUE。

我的表格现在同意我的导航栏和底部的标签栏。

答案 11 :(得分:1)

假设您的表格的@IBOutlet是

 @IBOutlet var tableView: UITableView!

创建一个函数prepareTable()。将以下行添加到该方法

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

从ViewDidLoad()

调用此方法

答案 12 :(得分:0)

让我们说你的大纲视图或故事板是一个标签栏控制器,它当前有一个表视图控制器。运行应用程序时,表视图单元格在状态栏下运行,该状态栏似乎具有透明背景。这很糟糕!

如果您花了几个小时尝试在StackOverflow上找到的所有东西都无济于事,感觉也许真的是时候考虑一​​个新的职业并准备拨打1-800-LUV-TRUK或1-800-SHT-KIKR ,给自己轻拍一下,在这样的时间打开你喝的任何灵丹妙药,因为这不是你的错。真。 Travis绝对正确,在这种情况下,viewDidLoad,viewWillAppear或viewDidAppear或IB中的按钮选择/取消选择中的任何代码都不会有用。

特拉维斯&#39;上面的解决方案肯定会有用,但它有点长,有复制和粘贴代码,我的注意力很短,因此Bugs Bunny的一集对我来说就像一部完整的电影,所以我只知道我搞砸了任何复杂的东西。但是,嘿,你的里程可能会有所不同。安美居...

在Xcode 7.3中,对于运行iOS 9的应用程序(我假设7和8,但我不确定这一点,而且我现在懒得检查)有一种更简单的方法,不需要一个写任何代码。并且它在Xcode的Interface Builder中完成。

警告: 很抱歉,如果任何条款都不准确。请告诉我错误的地方,我会纠正任何错误标记。

  1. 转到Interface Builder的Utilities区域,从库窗格中选择Object library。

  2. 选择导航视图控制器对象并将其拖到Storyboard场景中。您会注意到在您拖动时会出现两个场景项 - 这些是导航控制器场景和表视图控制器场景。

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

  4. 选择标签栏控制器与表格视图控制器之间的关系连接,然后点击&#34;删除&#34;。

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

  6. 按住Ctrl键从标签栏控制器场景拖动到导航控制器场景,然后选择&#34;关系塞格,查看控制器&#34;。

  7. 从导航控制器场景控制拖动到表视图控制器场景,然后选择&#34;关系搜索,根视图控制器&#34;。

  8. 最后,在公用事业&#39;对象库,将导航项对象拖动到表视图控制器场景的表视图中。

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

    希望这有帮助。