115

我已经将一个普通的简 UITableView 拖到 iOS 7 中的 UIViewController 上。

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

在此处输入图像描述

有任何想法吗?

4

21 回答 21

107

UIViewController的新iOS 7实现有一组新选项,允许开发人员选择系统是否会自动为UIScrollViewUITableView和派生添加插图。

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

查看控制器检查器

更多细节:

  1. 立即提交您的 iOS 7 应用程序。
  2. iOS 7 UI 过渡指南 > 外观和行为
于 2013-09-24T15:41:48.843 回答
81

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

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

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

于 2013-08-22T19:02:36.587 回答
68

来自 iOS7 过渡指南:

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

   self.automaticallyAdjustsScrollViewInsets = NO;
于 2013-11-12T08:40:27.160 回答
34

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

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

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

前

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

后

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

PD我没有使用自动布局也没有故事板

希望这可以帮助某人!

于 2014-04-11T18:09:41.110 回答
30

它解决了我的类似问题:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
于 2013-10-03T17:10:33.667 回答
13

尝试使用这个

tableView.separatorInset = UIEdgeInsetsZero;

显然,如果你支持低于 iOS7 的任何东西,你需要确保对象在调用它之前响应这个选择器。

于 2013-10-07T16:42:26.777 回答
9

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

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

于 2014-09-21T15:20:06.723 回答
8

在 iOS 9 中,此页面上的其他答案均不适合我(即取消选中 Storyboard 中的复选框,设置automaticallyAdjustsScrollViewInsetsNO)。

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

- (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无效。

于 2016-05-27T13:14:51.847 回答
5

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

在此处输入图像描述

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

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

在此处输入图像描述

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

在此处输入图像描述

于 2016-03-19T04:21:53.157 回答
4

这对我有用:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
于 2014-01-24T20:34:36.487 回答
2

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

于 2016-01-14T02:24:17.423 回答
1

在 Xamarin iOS 中,在前台模式对话框被解除后,我在后台 UITableViewController 上出现了这个问题。在进入前台的过程中, UITableViewController 设置了插图(在 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();
    }
}
于 2014-12-18T08:11:55.537 回答
1

我在容器视图中嵌入了一个 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);
    }
}
于 2014-06-23T07:38:04.623 回答
1

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

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

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

不要问我为什么,我仍然认为这是 UIKit 中的一个 bug。

于 2015-12-20T23:06:25.280 回答
0

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

于 2013-11-21T15:50:19.537 回答
0

如果以上答案都不起作用,请尝试将表格视图样式从分组更改为普通

在此处输入图像描述

于 2022-01-18T12:20:11.897 回答
0

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

于 2016-06-06T05:23:35.557 回答
0

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

我在情节提要中只有一个空白的 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
于 2017-01-18T01:22:34.397 回答
0

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

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
于 2018-05-07T02:51:43.683 回答
0

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

于 2016-10-25T23:21:51.650 回答
0

斯威夫特 3 解决方案:

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

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}
于 2016-10-13T14:52:55.673 回答