【问题标题】:why extra space is at top of UITableView - simple为什么 UITableView 顶部有额外的空间 - 简单
【发布时间】:2013-12-16 20:11:57
【问题描述】:

我正在学习一些 iOS 编程并尝试将 UITableView 放入情节提要中。不幸的是,我试图将内容放在视图的顶部,但它会占用一些空间。我试图在检查器中调整 View -> Mode 的值,但这似乎没有任何效果。

我已将背景设为绿色并设置了边框颜色以显示问题。我不是一个成熟的 iOS 开发人员,所以我认为这是最简单的解决方案,而不是复杂的东西。如何使表格视图的内容与顶部齐平?我看过这个Why is there extra padding at the top of my UITableView with style UITableViewStyleGrouped in iOS7,但不确定它是否相关。

感谢任何帮助


编辑#1

更新了此表视图属性的更改和屏幕截图

【问题讨论】:

标签: ios


【解决方案1】:

这对我很有效:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))

【讨论】:

    【解决方案2】:

    每个人都在谈论这个self.automaticallyAdjustsScrollViewInsets 选项。
    然而,这对我根本不起作用。对我有用的是,将“Content Insets”属性设置为Never

    真是个烦人的问题。

    【讨论】:

      【解决方案3】:

      也许您有多个父导航控制器?如果是这种情况,请取消选中其他父导航控制器的“显示导航栏”。

      【讨论】:

        【解决方案4】:

        是的,另一个问题非常相关。 UITableViewStyleGrouped 通过插入额外的填充将每个部分划分为一个“组”……类似于它在 iOS7 之前所做的,但默认情况下是透明的而不是彩色的,并且只是在顶部而不是一直在周围。如果您不希望默认填充,请使用UITableViewStylePlain

        否则,如果您需要保持样式相同,请按照其他人从该链接发布的建议进行操作并更改内容插图:

        self.tableView.contentInset = UIEdgeInsetsMake(-36, 0, 0, 0);
        

        或者按照这张海报的建议,将tableHeaderViewheight 设置为.-1,即接近0

        self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];
        

        【讨论】:

        • 嗯...我很确定它设置为 UITableViewStylePlain(包括截图)。
        • 感谢您的 contentInset。 self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);在带有导航栏的 ios 8 中。
        • 最好将神奇的数字0.01f替换为CGFLOAT_MIN ,如相关帖子所示。
        • 此解决方案不起作用的情况 1. 如果页眉颜色不同,页脚颜色不同。 2. 0.01f 的 initWithFrame 在 iOS 10 上崩溃,但标头不能为负值 -1 表示必须来自 >1 等。
        【解决方案5】:

        这就是它可以通过 Storyboard 轻松修复的方法:

        选择表格视图>尺寸检查器>内容插入:从不

        【讨论】:

          【解决方案6】:

          在 swift 3.0 中,希望对你有所帮助

          func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
              return CGFloat.leastNormalMagnitude
          }
          
          func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
              return CGFloat.leastNormalMagnitude
          }
          

          【讨论】:

            【解决方案7】:

            这很容易,对我来说非常有效。 在 Story Board 中选择您放置 UITableView 的控制器。

            YouStoryboard.storyboard > YouViewController > 属性检查器 > 取消选中 - 调整滚动视图插图。

            确保选择 UIViewController 而不是 UITableView。

            【讨论】:

              【解决方案8】:

              试试这个....

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

              【讨论】:

                【解决方案9】:

                这个问题的原因:-

                1. UITableView 不喜欢有高度为 0.0 的标题。如果你想要做的是有一个高度为 0 的标题,你可以跳转到解决方案。
                2. 即使稍后您为标题分配了非 0.0 的高度,UITableView 也不喜欢最初分配高度为 0.0 的标题。

                在 ViewDidLoad 中:-

                self.edgesForExtendedLayout = UIRectEdge.None
                
                self.automaticallyAdjustsScrollViewInsets = false
                

                不需要这样的东西:-

                self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)
                

                heightForHeaderInSection 代表:-

                if section == 0
                    {
                        return 1
                    }
                    else
                    {
                        return 40; // your other headers height value
                    }
                

                viewForHeaderInSection 代表中:-

                if section == 0 
                {  
                   // Note CGFloat.min for swift
                   // For Objective-c CGFLOAT_MIN 
                   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
                   return headerView
                }
                else
                { 
                   // Construct your other headers here 
                }
                

                【讨论】:

                  【解决方案10】:

                  在 Swift 中,您只需将以下属性设置为 false。

                  self.automaticallyAdjustsScrollViewInsets = false
                  

                  【讨论】:

                    【解决方案11】:

                    斯威夫特:

                    override func viewWillAppear(animated: Bool) {
                            self.edgesForExtendedLayout = UIRectEdge.None
                    
                           OR
                    
                    self.moduleListTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
                    
                           OR
                    
                     self.automaticallyAdjustsScrollViewInsets = false
                            }
                    

                    【讨论】:

                      【解决方案12】:

                      通过在 Storyboard 中选择 xib 或控制器,转到视图控制器的属性检查器。取消选中 Layout 中的 Adjust Scroll View Insets。会解决问题

                      【讨论】:

                      • 要以编程方式设置它,self.automaticallyAdjustsScrollViewInsets = NO; 在您的 viewDidLoad 方法中。