【问题标题】:UITableView is starting with an offset in iOS 7UITableView 在 iOS 7 中以偏移量开始
【发布时间】:2013-08-25 15:43:16
【问题描述】:

我在 iOS 7 中将一个普通的 jane UITableView 拖到了 UIViewController 上。

现在在第一个单元格开始之前有一个垂直的空间偏移量。我该如何摆脱它?我希望第一行更接近 UITableView 实际开始的顶部边缘。我没有要求大偏移量吗?

有什么想法吗?

【问题讨论】:

  • 我得到了以下帮助:YouStoryboard.storyboard > YouViewController > 属性检查器 > 取消选中 - 调整滚动视图插图。
  • 顺便说一句,您可以使用 Command 键 + S 对 iOS 模拟器进行截图
  • @Alexander:我也得到了您的建议的帮助,但是取消选中 ExtendEdges.UnderTopBars 再次导致垂直偏移空间出现。我不确定它是否是 Xcode6 中的(许多?)错误之一,但这些问题有时让我很头疼!

标签: uitableview ios7


【解决方案1】:

UIViewController 的新 iOS 7 实现有一组新选项,允许开发者选择系统是否会自动为 UIScrollView 添加插图strong>、UITableView 和派生类。

要禁用此行为,请取消选中 InterfaceBuilder 中所有想要的 UIViewController 的这些框,在 UIViewController 选定的对象检查器上:

更多详情:

  1. Submit your iOS 7 apps today.
  2. iOS 7 UI Transition Guide > Appearance and Behavior

【讨论】:

  • 谢谢!你救了我。
【解决方案2】:

默认情况下,表格视图控制器会将内容填充到导航栏下方,以便您可以滚动其下方的内容并在导航栏/工具栏下方以模糊状态查看它。

看起来您将其定位在 44(可能是 64)像素以将其从导航栏下方移出,但它已经对此进行了补偿,因此您获得了很大的差距。

转到 IB 中的故事板/xib 并取消选中导航栏内容下的节目内容。

【讨论】:

  • Sorry,iOS7 上关于 NDA 的评论如何无关紧要?这是一个帮助人们的论坛。
  • 在 Xcode 版本 5.1 上的 Viewcontroller 中取消勾选扩展边缘> 在顶部栏下删除顶部 UITableView 内容插图
  • 那么,nav bar thigo 下的显示内容在哪里?我找不到它。
  • Xcode 5.1.1 中的@FrankGorman 在情节提要中有一个特定视图控制器的选项是Adjust Scroll View insets,去掉复选标记。
  • 嘿@koratprashant。非常有用的评论。
【解决方案3】:

From iOS7 transition guide:

如果您不希望滚动视图的内容插入自动进行 调整后,自动将AdjustsScrollViewInsets 设置为NO。 (默认 automaticAdjustsScrollViewInsets 的值为 YES。)

   self.automaticallyAdjustsScrollViewInsets = NO;

【讨论】:

  • 这也可以在 XCode 的属性检查器中设置。取消选中视图控制器布局的 Adjust Scroll View Insets 复选框。
  • 如果您以编程方式加载 UIViewController(不使用 XIB),这就像一个魅力。在视图控制器中设置automaticallyAdjustsScrollViewInsets = NO
  • 这是给我的。令人困惑,因为我的 TableView 在容器视图中并且最初看起来很好。但是当从另一个视图控制器弹出时它搞砸了。
  • 太棒了!节省我很多时间!
【解决方案4】:

我遇到了类似的问题,在关闭 viewController 后,tableView 的 contentOffset 更改为 (0, -64)。

我的解决方案有点奇怪,我尝试了所有其他答案但没有成功,唯一解决我的问题是在 .xib 的控件树中切换 tableView 位置

它是父视图中的第一个控件,如下所示:

我在 ImageView 之后移动了 tableView 并且它起作用了:

似乎将表格视图放在第一个位置会导致问题,将表格视图移动到另一个位置可以解决问题。

P.D.我没有使用 autoLayout 也没有故事板

希望这可以帮助某人!

【讨论】:

  • 我注意到了同样的事情!我没有放置任何额外的视图,但简单地补偿了移动 UITableView -44 顶部的差距。在 IB 中,我似乎必须移动 -64px,但在运行时 -64px 会导致 tablview 覆盖导航栏并且 -44px 可以。我无法完全解释。当我在 iPhone 故事板中没有发现任何类似问题时,我在 iPad 弹出视图中发现了这个问题。
  • 即使使用 uiview 也会出现此问题。如果用户界面中显示的视图的放置顺序不同。
  • 我今天遇到了同样的问题,使用 XCode 6.1。又浪费了 2-3 个小时,试图解决 Apple 的错误......
  • 这非常有帮助,值得更多关注!对视图控制器设置或内容插入/偏移没有任何帮助,但更改情节提要中视图的顺序解决了我的问题。
  • 苹果,我的意思是... WTF?谢谢,这也修复了带有自动布局的故事板。
【解决方案5】:

它解决了我的类似问题:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

【讨论】:

  • 你应该用这种方式检查系统版本:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
  • 这对我遇到的间距问题很有用,但现在我的下拉刷新控制微调器显示在我的顶部菜单下方部分被遮挡。有人也看过这个吗?有什么解决方法吗?
  • @nickv2002 尝试以编程方式创建 tableView
  • 我尝试了所有其他解决方案,但只有一个对我有用
【解决方案6】:

试试这个

tableView.separatorInset = UIEdgeInsetsZero;

显然,如果您支持低于 iOS7 的版本,则需要确保对象在调用它之前响应此选择器。

【讨论】:

  • 不确定为什么要投票... separatorInset 只是更改单元格之间的距离线从视图边缘插入。问题是询问单元格上方和下方的空间
  • 该图片具有误导性,但在谷歌上搜索边距问题会产生此页面。
【解决方案7】:

说真的,更改 contentOffset 不是解决方案。您只是在修补问题而不是修复原因。我一直面临同样的问题,结果发现 grouped tableViews 在顶部有一个填充。在我的情况下,将类型设置为 plain 就可以了。

希望它能为某人节省几分钟。 Z.

【讨论】:

  • 我完全错过了,很高兴我找到了你的答案,UPVOTE
【解决方案8】:

对于 iOS 9,此页面上的其他答案均不适合我(即取消选中 Storyboard 中的复选框,将 automaticallyAdjustsScrollViewInsets 设置为 NO)。

我非常不满意的解决方法是:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

viewWillAppearviewDidLoad 中的相同行无效。

【讨论】:

  • 这应该是 uitableviewcontroller iOS 9 的唯一答案......真的,没有其他帮助,我都试过了,你在哪里找到的,或者你是怎么想出来的?许多 10 倍
  • 取消选中 Adjust Scroll View insets 复选框适用于 iOS 9。
  • 调整滚动视图插图对我没有任何其他解决方案?
【解决方案9】:

有时,当UIViewController 嵌入导航控制器时,我的表格视图顶部会出现64 高度间隙。

在过去,我只是重新创建所有内容,希望在白纸黑字之后约束变得正确。

TIL:如果您不想对Top Layout Guide 进行垂直约束,可以按住Option 键访问Container Margin

然后确保将Top Space to Superview 常量设置为0。这至少对我有用。

【讨论】:

  • 1.5 年后,但这解决了我的问题。谢谢!
【解决方案10】:

这对我有用:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

【讨论】:

    【解决方案11】:

    如果你在 UITableView 之前添加一个空的 UIView(或者任何可滚动的视图,例如 ScrollView 和 TextView),你可以有运气。

    【讨论】:

      【解决方案12】:

      我在容器视图中嵌入了一个 UITableViewController。为了摆脱不需要的 64 点垂直空间,我需要取消选中 Interface Builder 中的“调整滚动视图插图”,并在我的 UITableViewController 的 viewWillAppear 中设置 UITableView 的 contentInset,如下所示。

      垂直空间的大小似乎与导航栏的框架高度和 y 偏移相匹配。该问题仅出现在 iOS 7 上。

      - (void)viewWillAppear:(BOOL)animated;
      {
          [super viewWillAppear:animated];
      
          if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
              const CGRect navBarFrame = self.navigationController.navigationBar.frame;
              const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
              self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
          }
      }
      

      【讨论】:

        【解决方案13】:

        在 Xamarin iOS 中,在前台模式对话框被解除后,我在后台 UITableViewController 上出现了这个问题。在进入前台的过程中,UITableViewController 设置了 insets(在 iOS 的某个地方):

        这门课解决了

        public class UITableViewControllerWithBugFix : UITableViewController {
            public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
            }
        
            public override void ViewWillLayoutSubviews() {
                if (TableView.ContentInset.Top != 0.0f)
                    TableView.ContentInset = UIEdgeInsets.Zero;
                if (TableView.ScrollIndicatorInsets.Top != 0.0f)
                    TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;
        
                base.ViewWillLayoutSubviews();
            }
        }
        

        【讨论】:

          【解决方案14】:

          我不时会回到这种可怕的情况,我注意到它仍然是未知数。所以,为了以后的记忆……

          最近,我正在修复这个解决方法。

          1. 在 UITableView 顶部添加一个子视图,像素高度为零。使用或不使用自动布局。
          2. 如果我有信心 :-) 我删除了这个假视图,修复了顶部的约束,然后它神奇地起作用了。

          别问我为什么,我还是觉得这是 UIKit 深处的 bug。

          【讨论】:

            【解决方案15】:

            如果您转到故事板,您可以通过选择表格来更改偏移量,然后在属性检查器的表格视图部分下,您只需将左侧的分隔符插入更改为 0。

            【讨论】:

              【解决方案16】:

              我认为真正的解决方案是在 tableview 上设置顶部和底部约束等于 topMargin 和 bottomMargin。不是顶部布局指南和底部布局指南。这使您可以自动将AdjustsScrollViewInsets 保持为真。

              【讨论】:

                【解决方案17】:

                Swift 3 解决方案:

                class PaddingLessTableView : UITableView
                {
                    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
                    {
                        return nil
                    }
                
                    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
                    {
                        return nil
                    }
                }
                

                【讨论】:

                  【解决方案18】:

                  如果您将 TableViewController 嵌入到 NavigationController 或 ContainerView 中,You have to constraint to margins instead of top Layout guide in StoryboardCheck constraint to margins when you are doing the constraints 没有其他方法对我有用。我无法发表评论,所以我只是重申 Robert Chens 的回答。

                  【讨论】:

                    【解决方案19】:

                    我尝试了几个答案。更改情节提要中的设置会导致从左侧弹出的覆盖菜单出现涟漪问题。

                    我在情节提要中只有一个空白的 UIViewController,否则一切都是以编程方式生成的。

                    我在 UIViewController 内的 UIView 内的 UITableView 也有同样的问题。也就是说,当 UIViewController 嵌入到导航控制器中时,节标题开始太低了。没有导航控制器,一切正常。

                    为了解决这个问题,我创建了一个 UILabel 并在约束条件下放置了 UILabel 底部约束 = UIView 的顶部约束(因此它不会显示在屏幕上。现在有了额外的控件(新标签),TableView 的行为正常.

                        inputsContainerView.addSubview(titleLabel)
                        inputsContainerView.addSubview(tableView)
                    
                        // inputsContainerView
                        ///////////////////////////////////////
                        inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
                        inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
                        inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
                        inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true
                    
                        // tableView
                        ///////////////////////////////////////
                        tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
                        tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
                        tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
                        tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true
                    
                        // titleLabel - inserted to stop bad section header behavior
                        ///////////////////////////////////////
                        titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
                        titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
                        titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
                        titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
                    

                    【讨论】:

                      【解决方案20】:

                      我在 iOS 11 和 xib、UITableviewController 中遇到了同样的问题,我解决了如下

                      [self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-02-06
                        • 2014-01-20
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-04-11
                        相关资源
                        最近更新 更多