UITableView从iOS 7中的偏移量开始


115

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

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

在此处输入图片说明

有任何想法吗?


43
以下内容为我提供了帮助:YouStoryboard.storyboard> YouViewController>属性检查器>取消选中-调整滚动视图插图。
亚历山大

17
顺便说一句,您可以使用Command键+ S
Hemang 2013年

@Alexander:我也得到了您的建议,但是取消选中ExtendEdges.UnderTopBars再次导致出现垂直偏移空间。我不确定它是否是Xcode6中的(许多?)错误之一,但有时这些问题使我有些头疼!
iOS-Coder

Answers:


81

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

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

转到IB中的情节提要/ xib,然后取消导航栏下的显示内容。


6
抱歉,关于iOS7上的NDA的评论如何无关紧要?这是一个帮助人们的论坛。
Cocoadelica

在Viewcontroller上的Xcode版本5.1中,取消选中扩展的边缘>在顶部栏下,删除顶部UITableView内容插图
Emel Elias

3
那么,导航栏thigo下的显示内容在哪里?我找不到
Anup Kattel 2014年

10
Xcode 5.1.1中的@FrankGorman故事板中有一个特定视图控制器的选项是Adjust Scroll View insets,取消选中标记。
呵叻蓬勃发展2014年

1
嘿@koratprashant。非常有用的评论。
KDeogharkar '16


68

从iOS7过渡指南:

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

   self.automaticallyAdjustsScrollViewInsets = NO;

9
也可以在属性检查器的XCode中进行设置。取消选中Adjust Scroll View Insets视图控制器布局的复选框。
安德鲁

1
如果您以编程方式(而不使用XIB)加载UIViewController,则它的工作方式就像一种魅力。automaticallyAdjustsScrollViewInsets = NO在视图控制器中设置。
2014年

这是给我的。令人困惑,因为我的TableView位于容器视图内,并且最初看起来还不错。但是从另一个视图控制器弹出时,它搞砸了。
n13

大!节省我很多时间!
inix 2016年

34

我有一个类似的问题,解雇了一个viewController之后,我的tableView的contentOffset更改为(0,-64)。

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

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

之前

我将tableView移到ImageView之后,它可以正常工作:

后

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

PD我既没有使用autoLayout也没有使用故事板

希望这可以帮助某人!


我注意到了同样的事情!我没有放置任何其他视图,而是简单地弥补了将UITableView -44移至顶部的空白。在IB中,似乎必须移动-64px,但在运行时-64px会导致tablview覆盖导航栏,并且-44px可以。我不能完全解释。我没有在iPhone故事板上看到任何类似的问题时,在iPad弹出视图中发现了此问题。
Mike Keskinov 2014年

即使使用uiview,也会出现此问题。如果用户界面中显示的视图的放置顺序不同。
Rinku 2014年

2
今天,我在使用XCode 6.1时遇到了同样的问题。浪费另外2-3个小时,试图解决Apple的错误...
Mike Gledhill 2014年

3
这非常有帮助,值得更多注意!摆弄视图控制器设置或内容插入/偏移没有什么帮助,但是更改情节提要中视图的顺序对我来说解决了这个问题。
Caleb 2014年

1
苹果,我的意思是... WTF?谢谢,这也修复了自动布局的情节提要。
Borzh

30

它解决了我类似的问题:

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

1
您应该使用以下方式来检查系统版本:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes 2014年

这对于我遇到的间距问题很有效,但是现在我的“从上到下”控制微调器在顶部菜单的下面部分被遮盖了。有人也看到了吗?任何解决方法?
尼克,

@ nickv2002尝试以编程方式创建tableView
Alex

我尝试了所有其他解决方案,但只有该解决方案对我
有用

13

试试这个

tableView.separatorInset = UIEdgeInsetsZero;

显然,如果您支持的不是iOS7,则需要确保对象在调用此选择器之前对其做出响应。


4
不知道为什么要投票赞成... eparatorInset只是更改了从视图边缘插入的单元格之间的距离线。问题是询问细胞上方和下方的空间
伦勃朗·Q·爱因斯坦

该图像具有误导性,但是常见的Google搜索边距问题产生了此页面。
2014年

9

认真地说,改变contentOffset不是解决方案。您只是在修补问题,而不是解决原因。我一直面临着同样的问题,事实证明,分组的 tableView在顶部具有填充。就我而言,将类型设置为普通可以解决问题。

希望它可以节省几分钟的时间。Z.


1
我完全想念它,很高兴找到您的答案,UPVOTE
AamirR

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


这应该是uitableviewcontroller iOS 9的唯一答案。。。确实,没有其他帮助,我已经尝试了全部,您在哪里找到的,或者如何找到的?许多10x
Erez

取消选中Adjust Scroll View insets复选框适用
Adam

调整滚动视图插图不适用于我其他解决方案吗?
Yogesh Patel

5

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

在此处输入图片说明

过去,我只是重新创建所有内容,希望这些约束在清理干净后能够正确执行。

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

在此处输入图片说明

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

在此处输入图片说明


1.5年后,但这解决了我的夜晚。谢谢!
asp_net

4

这对我有用:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

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

2

如果在UITableView之前添加一个空的UIView(或任何可滚动的视图,例如ScrollView和TextView),那么可能会很幸运。


1

我在容器视图中嵌入了UITableViewController。为了摆脱不必要的垂直空间的64个点,我需要在Interface Builder中取消选中“ Adjust Scroll View Insets”,并在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);
    }
}

1

在Xamarin iOS中,前台模式对话框关闭后,我在后台UITableViewController上发生了此问题。在移到前台的过程中,UITableViewController设置了inset(在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();
    }
}

1

我时不时地回到这种糟糕的境地,我注意到它仍然是一个未知数。所以,为了将来的记忆...

最近,我正在解决此变通办法。

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

不要问我为什么,我仍然认为这是UIKit中的一个深层错误。


0

如果转到情节提要,则可以通过选择表格来更改偏移量,然后在“属性”检查器中的“表格视图”部分下,只需将左侧的“分隔符插入”更改为0。


0

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


0

Swift 3解决方案:

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

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

0

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


0

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

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

我在UIViewController内的UIView内的UITableView遇到相同的问题。即,当将UIViewController嵌入到Navigation Controller中时,节标题开始太低。没有导航控制器,一切正常。

为了解决该问题,我创建了一个UILabel,并在其中放置了UILabel底部约束= UIView的顶部约束(因此它不会显示在屏幕上。现在有了该附加控件(新Label),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

0

我在iOS 11和xib,UITableviewController中遇到了相同的问题,如下所示解决了该问题

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.