【问题标题】:How do I make my iOS7 UITableViewController NOT appear under the top status bar?如何让我的 iOS7 UITableViewController 不出现在顶部状态栏下?
【发布时间】:2014-01-08 08:08:46
【问题描述】:

我的根控制器是 TabBarController(选项卡式应用程序)。其中一个选项卡是 UITableViewController。当我切换到该项目并滚动浏览项目时,它们会显示在顶部的状态栏下方(信号、电池等)。我不想要那个。我希望它是不透明的或......什么的。表格单元格的文本覆盖在状态内容之下,这在视觉上是不和谐的。

我可以在我的 Storyboard 中使用一些我不理解的属性设置来解决这个问题吗?还是我需要在我的子类中添加一些方法?或者也许我需要用其他类型的控制器包装我的 UITableViewController?

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

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

屏幕截图

我的故事板(缩小)显示了一个选项卡式控制器,有 2 个子级,一个单一视图,另一个是表格视图。

标签栏控制器的设置

表格视图控制器的设置

这款应用在我的手机上最终的样子

故事的结局

尽管下面有很多答案,但没有一个真正奏效。有点,但不是真的。我也尝试了 Embed in NavigationController 方法,但也有问题。但确实有效的是:

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

【问题讨论】:

  • 您是否在情节提要中尝试过:属性检查器 -> 扩展边缘 -> 取消选中顶栏。 ?
  • @Ilario:是的。没有区别:(
  • @Ilario 为我工作 +1

标签: ios objective-c layout ios7 uitableview


【解决方案1】:

在 viewDidLoad 中试试这个:

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

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

【讨论】:

  • 嗯,这是最接近的。它使初始布局成为我正在寻找的。滚动时,它仍然重叠。我开始认为 UITableViewController 真的不应该在没有 UINavigationController 的情况下存在?
  • 将 20 替换为 64。状态栏 + 导航栏高度 = 64。希望这可行
  • 我误读了您的评论。我唯一的另一个想法是放置一个带有背景图像的虚拟 UINavigationBar,除了状态栏后面的部分之外,它都是透明的
  • 请修正拼写,应该是tableView。谢谢。
  • 这对我有用,只有放在 viewDidLoad 中(即不在 viewWillAppear 中)并且 20 实际上是 -20(负数)。
【解决方案2】:

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

对我有用的是取消选中父标签栏控制器中的“扩展边缘”选项。这在 iOS7 和 iOS6 中提供了一致的行为。

【讨论】:

  • 这对我遇到的上述问题很有用。从情节提要本身解决问题。谢谢弗洛里安。
【解决方案3】:

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

使用上面和下面的 cmets,我可以通过将其放入

中使其工作
-(void)viewWillAppear instead of ViewDidLoad
     self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 在视图控制器的viewWillAppear 方法对我有用。
    • 我补充说(甚至没有打扰 if 守卫),并没有真正改变任何东西。 :(
    • @TravisGriggs,如果它不适合你,你已经严重不正确地实现了一些东西,因为这是在 iOS7 应用程序中处理这种情况的官方方式。
    • @holex,您是否使用如图所示的情节提要(或嵌入 NavigationController)制作了一个应用程序并在真实设备上实际试用?
    • @TravisGriggs,你的问题是个笑话,不是吗?
    【解决方案5】:

    如果有人错过了(现在很长)问题末尾的故事如何结束部分,简短的回答是:使用简单的 UIViewController 和 TableView , 而不是 TableViewController 如果您想实现既定目标。

    【讨论】:

    • 所以在这种情况下使用静态单元格是不可能的。
    • @user623396 是的,这不起作用,因为使用静态单元格时需要 UITableViewController。无赖。
    • 不是理想的解决方案...使用静态单元格时无法工作:(
    • 我认为这不会改变任何事情。 UIViewController 将具有相同的行为。唯一的区别是您可以移动 TableView 作为一种解决方法,以不了解如何将视图内容直接放在导航栏下方。相反,我看到了两种有效的解决方案: * 一种是按照其他人的建议使用self.edgesForExtendedLayout = UIRectEdgeNone。 * 另一种是使用导航栏样式为Opaque,将视图内容推送到导航栏下方,因为它会阻挡其下方的内容。
    【解决方案6】:

    我将以下内容添加到viewWillAppear

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

        假设你的表的@IBOutlet 是

         @IBOutlet var tableView: UITableView!
        

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

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

        从 ViewDidLoad() 调用此方法

        【讨论】:

          【解决方案9】:

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

          [self.navigationController.navigationBar setTranslucent:NO];
          

          【讨论】:

          • 我在UITableViewController 子类的viewDidLoad 方法中添加了[self.navigationBar setTranslucent:NO];。显然,UITableViewControllers 没有 navigationBar 属性;它不编译。
          • 试试 [self.navigationController.navigationBar setTranslucent:NO];
          • OK,编译成功。我不需要尝试。但遗憾的是它没有达到预期的效果:(
          • 如果可能的话,您能否发布一张当前发生的事情以及您正在寻找的内容的屏幕截图。
          • 他说的是状态栏,不是导航栏。
          【解决方案10】:

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

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

          然后我在页眉文本的 origin.y 中添加了 20。

          然后我通过使用

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

          【讨论】:

            【解决方案11】:

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

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

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

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

            关于 UITableViewController 的构造函数

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

            【讨论】:

            • @Kyslik 谢谢你的建议......这是我的第一个答案,我对格式不太好......
            【解决方案12】:

            从 iOS 8.4 开始,我在其他答案中列出的各种情节提要选项中一无所获。

            我在不使用任何维度常量的情况下解决了这个问题,方法是在我的选项卡控制器中放置一个常规视图,然后用一个“容器视图”填充它,然后我用一个“嵌入”segue 连接到我的 UITableViewController。

            我的表格现在尊重我的导航栏和底部的标签栏。

            【讨论】:

              【解决方案13】:

              假设您的大纲视图或情节提要是一个标签栏控制器,目前有一个表格视图控制器。当您运行该应用程序时,您的表格视图单元格在似乎具有透明背景的状态栏下运行。这太糟糕了!

              如果您花费数小时尝试在 StackOverflow 上找到的所有内容均无济于事,那么您觉得也许是时候考虑新的职业并准备拨打 1-800-LUV-TRUK 或 1-800-SHT-KIKR ,拍拍自己的后背,在这种时候打开你喝的任何灵丹妙药,因为这不是你的错。真的。 Travis 是绝对正确的,在这种情况下,viewDidLoad、viewWillAppear 或 viewDidAppear 中的任何代码或 IB 中的按钮选择/取消选择都无济于事。

              上面的 Travis 的解决方案肯定会起作用,但它有点长,有代码的复制和粘贴,我的注意力很短,以至于一集 Bugs Bunny 对我来说就像一部完整的电影,所以我只是知道我会搞砸任何复杂的事情。但是,嘿,您的里程可能会,甚至可能会有所不同。随便...

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

              警告: 对不起,如果任何条款不准确。请让我知道我在哪里弄错了,我会纠正任何错误的标签。) p>

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

              2. 选择一个 Navigation View Controller 对象并将其拖到 Storyboard 场景中。您会注意到在拖动时出现了两个场景项目——它们是导航控制器场景和表格视图控制器场景。

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

              4. 选择 Tab Bar Controller 和 Table View Controller 之间的关系连接,然后点击“删除”。

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

              6. 按住 Control 从标签栏控制器场景拖动到导航控制器场景并选择“Relationship Segue,视图控制器”。

              7. 按住 Control 从导航控制器场景拖动到表视图控制器场景并选择“Relationship Segue,根视图控制器”。

              8. 最后,在 Utilities 的 Objects 库中,将 Navigation Item 对象拖到 Table View Controller Scene 的 Table View 中。

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

              希望这会有所帮助。

              【讨论】:

                猜你喜欢
                • 2016-08-15
                • 1970-01-01
                • 2013-12-07
                • 1970-01-01
                • 2014-03-12
                • 1970-01-01
                • 2013-09-26
                • 2020-04-26
                • 1970-01-01
                相关资源
                最近更新 更多